2012-06-21 3 views
28

私はいくつかの異なるプロジェクトを作業しましたが、私はjquery/javascript関数を作成する2つの異なる方法を見てきました。関数を変数に代入するかどうかの違い

最初:

function testFunction(){ 

}; 

秒:

var testFunction = function(){ 

}; 

は、これらの間に違いはありますか?

+3

ます。http:// kangax

console.log(x); //undefined (not TypeError) var x = 10; 

あなたはJavaScriptエンジンは、このようなコードを解釈することを想像することができます。 github.com/nfe/これを読んで –

+0

Seconded ....... –

答えて

43

最初のもの(関数宣言)は、が宣言されているスコープの先頭にを吊り上げたものです。一方、2番目のもの(関数式)は宣言されていません。

testFunction(); 
function testFunction() {} 

割り当てがその場で起こるので、あなたは、関数式でこれを行うことはできません。

これは、あなたがそれを呼び出した後に宣言された関数を呼び出すことができます理由です。

testFunction(); 
var testFunction = function() {}; //TypeError 

第三の形態(関数式命名)もある。

var testFunction = function myFunc() {}; 

この場合、識別子myFuncは関数内にのみ存在し、testFunctionは宣言されたスコープ内で使用できます。 BUT(そしてInternet Explorerの場合は常にありますが)バージョン9より下のIEでは、myFuncの識別子が誤って包含範囲に漏れています。名前付き関数式は、呼び出し関数を参照する必要がある場合に便利です(arguments.calleeは推奨されていません)。


はまた同じことが、変数宣言の真実であることに注意してください。

var x; //Declaration is hoisted to top of scope, value is `undefined` 
console.log(x); 
x = 10; //Assignment happens where you expect it to 
+8

+1 ***知識***私はこれがどのように働いたのか分かりませんでした。私は 'var testFunction = function(){}'の問題を抱えていて、その理由を知らなかった。これは完全に理にかなっています。 – iambriansreed

+0

IE9はそのバグを修正しました。 –

+0

@ imeVidas - 右。私はそれを追加します。 –

関連する問題