35

私はいくつかの異なるプロジェクトに取り組んでおり、jQuery/JavaScript関数を作成する2つの異なる方法を見てきました。

最初:

function testFunction(){

};

二番目:

var testFunction = function (){

};

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

4

1 に答える 1

53

主な違いは、最初のもの(関数宣言)が宣言されているスコープの一番上に持ち上げられているのに対し、2番目のもの(関数式)はそうではないことです。

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

testFunction();
function testFunction() {}

割り当てはインプレースで行われるため、関数式ではこれを行うことはできません。

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

3番目の形式(名前付き関数式)もあります。

var testFunction = function myFunc() {};

この場合、識別子myFuncは関数内のスコープ内にのみ存在しますが、testFunction宣言されているスコープ内で使用できます。しかし、バージョン9より前のIEでは(Internet Explorerに関しては常にありますが)、myFunc識別子が含まれているスコープに誤ってリークします。名前付き関数式は、呼び出し元の関数を参照する必要がある場合に役立ちます(arguments.callee非推奨になっているため)。


また、変数宣言についても同じことが言えます。

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

JavaScriptエンジンがコードを次のように解釈することを想像できます。

var x; //Declaration is hoisted to top of scope, value is `undefined`
console.log(x);
x = 10; //Assignment happens where you expect it to
于 2012-06-21T21:13:08.123 に答える