2016-04-15 4 views
3

いくつかの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"} 

次のコードと、その出力を確認してください?

+1

"元のウィンドウオブジェクトにアクセスするコードを本当に分離する方法はありますか?" 'var global = Function( 'return this')();' –

+0

@YuryTarabankoこれは答え(つまり「いいえ」)でなければなりません。ここの外側の関数が厳密なモード(最奥の 'this'がそれを取得するのを止める)に置かれたとしても、それは最も内側の関数の' window'を保持するように働きます。 –

答えて

2

strictモードを使用すると、関数が定義されたコンテキスト(new、bind、call、apply)なしで呼び出されます。これは未定義なので、グローバルオブジェクトウィンドウを変更することはできません。 mozilla documentation about strict modeをお読みください。次の文章を検索できます:ブラウザで、それは厳密 モード関数内で、この窓オブジェクトを参照することはもはや 可能だということ、とりわけ、意味ない

自分を納得させるためには、ブラウザでこのコードを試すことができます。

function useStrictMode() { 
    'use strict'; 
    console.log(this); 
} 

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

useStrictMode(); //log undefined 
noStrict(); //log window 

は、あなたのファイルのすべてのコンテンツは、それを使用するようになりますファイルの先頭に「厳格な使用」置きます。しかし、あなたがjsファイルを他のファイルと結びつけてしまうと、問題が生じる可能性があります。実際、 'use strict'はコードの一部を変更していくつかのライブラリを破壊することができます。これは、常に匿名関数ですべてのコードをラップすることが推奨される理由の1つです。

(function(){ 
    'use strict'; 

    //your code go here, function declaration here will use strict mode to 
})(); 
+0

具体的には、最初の関数の中で 'use strict ';を最初の行として追加します。そうすると、次のような出力が得られます: 'Object {foo:" bar "}" ... '未定義オブジェクト{foo:" bar "}' –

+0

ここに例があります:https:// jsfiddle .net/3rnyp6dn/ –

+1

@RaulFernandez理想的には ''厳密な使用 '; 'はグローバルスコープに影響を与えないように関数内にあるべきです。 strictモードをグローバルに使用すると、サードパーティのコードで問題が発生する可能性があります。 –

関連する問題