35

我参与了几个不同的项目,并且看到了两种不同的创建 jQuery/JavaScript 函数的方法。

首先:

function testFunction(){

};

第二:

var testFunction = function (){

};

这些有区别吗?

4

1 回答 1

53

主要区别在于第一个(函数声明)被提升到声明它的范围的顶部,而第二个(函数表达式)不是。

这就是您能够调用在调用后已声明的函数的原因:

testFunction();
function testFunction() {}

你不能用函数表达式来做到这一点,因为赋值发生在原地:

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

还有第三种形式(命名函数表达式):

var testFunction = function myFunc() {};

在这种情况下,标识符myFunc仅在函数内部的范围内,而testFunction在它声明的任何范围内都可用。但是(并且总是有一个但是当涉及到 Internet Explorer 时)在版本 9 以下的 IE 中,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 回答