0

オブジェクトを取り、そのオブジェクトのコードがウィンドウを参照するのを防ぐことができるサンドボックス モジュールを作成しようとしています。

これが概念的にどのように機能するかです。

var sand = function(window) {
var module = {
    say: function() {
        console.log(window.location);
    }   
};
return module;
}
sand({}).say(); // window.location is undefine

オブジェクトがパスインの場合、これは機能しません

var $sand = (function(){
return function(obj, context) {
    return (function(obj, window) {
        window.module = {};
        // doesn't work even copy object
        for (p in obj) {
            window.module[p] = obj[p];
        }
        console.log(window.location); // undefine
        return window.module;
    }(obj, context));
};
}());

var module = {
say: function() {
    console.log(window.location);
}
};

$sand(module, {}).say(); // still reference to window.location

このパターンを機能させるにはどうすればよいですか?

4

3 に答える 3

1

関数のスコープ内に変数のシャドウイングがない限りwindow、関数は にアクセスできますwindow。という変数があったとしてもwindow、単に を省略するだけで、コードはプロパティにアクセスできますwindow.

(function(window) {
    console.log(window.location); //undefined
    console.log(location); //this will still work
})({ });

つまり、ブラウザ環境で JavaScript をサンドボックス化することは、このようにはできません。

于 2012-04-19T15:03:49.083 に答える
1

最初の例では、 window が唯一の理由はundefined、空のオブジェクトを渡して引数を呼び出しているwindowため、実際のを隠しているためwindowです。

thisまた、次のように変数をクロージャー内に巻き上げることで、いつでも window オブジェクトにアクセスできます。

console.log ( ( function () { return this; } )() );

したがって、どうにかして をブロックできたとしても、window再び元に戻すのは簡単です。

于 2012-04-19T15:05:14.153 に答える
0

サンドボックスの外で関数を定義すると、コンテキストは現在のものになり、それ以外のことはできません。

本当にサンドボックス化を行いたい場合は、iframe を使用してそれを実現する必要があります。https://github.com/substack/vm-browserifyを見てください。これはノードのモジュールのブラウザー バージョンです。vmいくつかの優れた作業を抽出できるはずevalです。やってみたいです。

于 2012-04-19T15:05:09.763 に答える