2017-04-15 17 views
0

私はホイストの一般的なルールを知っていますが、変数と関数はコンパイル段階で吊り上げられます。したがって 次自己呼び出し機能でjavascriptを巻く

var foo = 'global'; 

var foo; //undefined 
foo = 'global'; // declared 

、としてコンパイルされますが、これは自己呼び出しである理由私は


var foo = 'global'; 
var myObject = { 
foo: 'local', 
func: function(){ 
    console.log(this.foo); // local 
    (function(){ 
    console.log(this.foo); // global 
    })(); 
} 
} 
myObject.func(); 

を理解することができません何であると書かれて何もMyObect内でグローバルfooを印刷する/ウィンドウのコンテキストを取る?

一般的に私が理解しようとしているのは、どこで吊り上げているのかです。

+2

生命維持内側 'this'は' window'ですので。呼び出される実行コンテキストはグローバルコンテキストです。これは、 'obj.func()'のようなオブジェクトでは呼び出されないので、 'this'はデフォルトで' window'を参照するためです。 – Li357

+0

自己呼び出し関数は、obj.func()が宣言されたときにのみ実行されるべきではありません。 – patz

+0

@patz吊り上げることは何もありません。 * context *の理解はjsに適合しません... –

答えて

1

console.log(this.foo)を呼び出す前にconsole.log(this);を追加すると、thisは基本的にはwindowとなります。これが、グローバルfooを取得している理由です。

関数内のデフォルト値thisは、直接呼び出されると「グローバルオブジェクト」です。ブラウザでは、グローバルオブジェクトはwindowです。あなたは、この場合にもwindowが表示されます。

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

を使用すると、関数式を定義して、すぐにそれを呼び出しているので、それは基本的にあなたが直接、通常の関数を呼び出すような方法に類似(関数を直接呼び出すことです)。

+0

しかし、なぜそれが 'window'ですか? – Li357

+0

@AndrewLi理由を説明する行を追加しました。 –

+0

質問は自己呼び出し関数に関するものです。 myObjectの上/上にホイストされた自己呼び出し関数です。 – patz

1

ウィンドウは、すべてが(一般的に)実行されるグローバルコンテキストです。

関数外(またはvarなしの関数)で宣言したものは、グローバルオブジェクトのプロパティ(メソッド)として扱われます。

例えば、setTimeout(foo, 1000)またはsetInterval(foo, 1000)を呼び出すと、それに応じてwindow.setTimeout(foo, 1000)window.setInterval(foo, 1000)と扱われます。

この部分:あなたが最初console.logを起動すると

func: function(){ 
    console.log(this.foo); // local 
    (function(){ 
    console.log(this.foo); // global 
    })(); 

、それは、オブジェクトのメソッドです関数の内部で呼び出されています。次のconsole.logは、と同じレベルではないの別の関数内で呼び出されるため、デフォルトではその呼び出しコンテキストはグローバルオブジェクトです。

var self = this 

だからのようになります。コードは次のとおりです:

func: function(){ 
    console.log(this.foo); // local 
    var self = this; 
    (function(){ 
    console.log(self.foo); // now it's local 
    })(); 

2.

もちろん

、次の行を入れてオブジェクト自体への参照を格納することができます

質問は自己呼び出し関数に関するものです。myObjectの上/上にホイストされた自己呼び出し関数です。あなたの特定のケース

巻上げは機能の内部について変数の宣言ではありません。

オブジェクト宣言は同じではありません。 funcは、オブジェクトの単なるプロパティです。巻き上げは、関数定義で満たすことができる。

foo = "global"; 
var test = function(){ 
    var foo; 
    // Declared but not defined 
    console.log(foo); 
    foo = 'local'; 
    // Now it's defined. Thanking to functional scope, the function "sees" local variable 
    console.log(foo); 
} 

あるいはさらに良い:

foo = 'global'; 
var test = function(){ 
    console.log(foo); // undefined, but declared 
    var foo; 

    foo = 'local'; 
    console.log(foo); 
} 
関連する問題