いくつかのJavaScriptコードを実行したいとしますが、内部で定義された無制限の関数でもこの新しいコンテキストにバインドされるようにグローバルコンテキストを変更するにはどうすればよいですか?私の現在のアイデアは次の通りです:無制限の関数を `window`とは別のものに自動的に束縛することはできますか?
(function() {
var window = {foo: 'bar'}; // just an example
(function() {
// PUT CODE HERE
}).call(window);
})();
これは簡単なことに役立ちます。どちらも内部関数のコンテキストとwindow
オブジェクトは、私が宣言された変数を指すようになります:
(function() {
var window = {foo: 'bar'}; // just an example
(function() {
// <CODE>
console.log(this, window);
// </CODE>
}).call(window);
})();
出力は、私が期待したものである:Object {foo: "bar"} Object {foo: "bar"}
。
しかし、内部コード(例えばFunction.prototype.bind
を使用していない)、そのthis
オブジェクトを指定せずに関数を定義するとき、それは自動的にthis
としてオリジナルwindow
オブジェクトを取得します。真にオリジナルwindow
オブジェクトへのアクセスを取得するコードの一部を分離する方法はあり
(function() {
var window = {foo: 'bar'};
(function() {
// <CODE>
console.log(this, window);
(function() {
console.log(this, window);
})();
// </CODE>
}).call(window);
})();
// This code outputs:
Object {foo: "bar"} Object {foo: "bar"}
Window {external: Object, chrome: Object, document: document, configData: Object, speechSynthesis: SpeechSynthesis…} Object {foo: "bar"}
次のコードと、その出力を確認してください?
"元のウィンドウオブジェクトにアクセスするコードを本当に分離する方法はありますか?" 'var global = Function( 'return this')();' –
@YuryTarabankoこれは答え(つまり「いいえ」)でなければなりません。ここの外側の関数が厳密なモード(最奥の 'this'がそれを取得するのを止める)に置かれたとしても、それは最も内側の関数の' window'を保持するように働きます。 –