2016-12-03 22 views
0

私は何かに気付き、周りを遊んでいる間に簡単な質問をしました。Javascript:グローバルコンテキストと関数のコンテキスト宣言

グローバル/ウィンドウコンテキストでコードを実行すると、関数宣言がウィンドウオブジェクトにメソッドとして追加されます。

しかし、私が別のオブジェクトのコンテキストにいるとき、関数宣言を書くことは、そのメソッドを自分のオブジェクトメソッドに追加しません。

function functionInGlobalCtx() { // This will be added as a function to the window object 
    // code... 
} 

var myObject = {}; 

myObject.myObjectFunction = function() { 

    var $this = this; // The context here is the 'myObject' object 

    function functionHopefullyInMyObjectCtx() { 
     // code... 
    } 
} 

myObject.myObjectFunction(); 

なぜ関数宣言はウィンドウオブジェクトの一部として存在しますが、オブジェクトのためのものではありませんか?

これは単純に「JavaScriptがどのように機能するか」(特別なルールはグローバルコンテキストに適用されますか)ですか、何か不足していますか?

ありがとうございました。

答えて

1

グローバルに宣言されたすべての関数は、グローバルウィンドウオブジェクトにアタッチされます。それがJavaScriptの仕組みです。

JavaScriptには機能スコープしかありません。したがって、別の関数の中で宣言された関数は、外部関数に対してprivateです。

機能functionHopefullyInMyObjectCtxにはまだ外部からアクセスできません。

myObject.myObjectFunction = function() { 
    var $this = this; 
    function functionHopefullyInMyObjectCtx() { 
     // code... 
    } 
} 

関数内の関数を宣言すると、自動的にthisに添付していません。しかし機能はプライベートのまま、それが中で宣言された範囲内でのみアクセス可能です

あなたがここmyObject.myObjectFunctionからfunctionHopefullyInMyObjectCtx機能にアクセスしたい場合の方法です:。

var myObject = {}; 

myObject.myObjectFunction = function() { 
    return { 
     functionHopefullyInMyObjectCtx: function() { 
      console.log('I got called'); 
     } 
    } 
} 

obj = myObject.myObjectFunction(); 
//obj now has ref to the inner function 
obj.functionHopefullyInMyObjectCtx(); 

私が呼ばれました

ここで

は良い読み物です:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions

1

その実際understanda ble。機能はオブジェクトです。 Myobjectとmyobjectfunctionは2つの異なるオブジェクトです。それは「これ」と機能そのものです。

この例では、myobj関数ではなく、myobject関数で希望関数を定義しています。

0

私が探していた答えが見つかりました。

変数がグローバル/ウィンドウオブジェクトに自動的に割り当てられるのはなぜですか?

JavaScriptエンジンは、グローバルスコープ内で宣言された項目の「グローバル環境レコード」を保持しているため(すべてのスコープにすべての宣言情報を保持する環境レコードがあるように)、グローバル環境レコードと通常スコープ環境レコードは、エンジンが、このレコードをウィンドウオブジェクトを介してコード内でアクセスできるようにすることです(エンジンの内部使用だけでなく)。

私が間違っている場合やそれが正しくない場合は、先に進んで私を修正してください。

ありがとうございました。

https://es5.github.io/x10.html#x10.2.3

Difference between variable declaration syntaxes in Javascript (including global variables)?