我已经看到最近的代码示例将函数放在变量中,然后像普通函数一样调用函数。
如:
var myFunctionName = function() {
Code Here...
}
myFunctionName();
我确信更先进的场景有很多优点,但我只是很好奇。
答案 0 :(得分:12)
没有任何优点,你没有将函数放在一个变量中,你只是简单地命名函数。
function foo() { /* ... */ }
var foo = function () { /* ... */ }
除了一件事,这些完全相同。
这有效:
foo("Hello!");
/* Later on... */
function foo() { /* ... */ }
这不起作用:
foo("Hello!");
/* Later on... */
var foo = function () { /* ... */ }
JavaScript解释器会在运行之前对所有function foo
进行预处理,并将它们推送到程序的顶部,以便它们可用,但不会对var foo = function
执行此操作。
答案 1 :(得分:5)
这称为函数表达式,其行为与函数声明略有不同。除此之外,当你可以参考它时,它的行为也不同。例如,如果你这样做:
var myFunctionName = function() {
Code Here...
}
在分配之后,您无法调用或引用该功能,而
function myFunctionName() {
Code Here...
}
可以在同一范围内的任何地方引用,甚至在声明它之前。这是因为Javascript中的一个名为“hoisting”的功能,其中所有函数声明都移到了幕后代码块的顶部。
另见:
What is the difference between a function expression vs declaration in JavaScript?
http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting
答案 2 :(得分:2)
您可以使用函数表达式执行某些操作,但不能使用声明。
可以立即调用它,并将返回值存储在变量
如果您不在全局命名空间中,则可以排除var
关键字以创建全局
修改强>
这是一个立即调用的示例。它向myFunctionName
变量返回一个函数,该变量可以访问在紧接调用的函数中作用域的变量和参数。
var myFunctionName = function( v ) {
// do something with "v" and some scoped variables
// return a function that has access to the scoped variables
return function() {
// this function does something with the scoped variables
};
}( 'someVal' );
// now this function is the only one that has access
// to the variables that were scoped in the outer expression.
myFunctionName();
这是一个函数维护数值的示例。您可以重复调用该函数,为其添加一个数字以添加到计数中。它将始终引用当前值,因此每次调用都是累积的。
示例: http://jsfiddle.net/5uuLa/1/
var counter = function( value ) {
return function( addValue ) {
value += ~~addValue;
return value;
};
}( 10 ); // initialize with a value
// each call builds on the result of the previous
console.log( counter( 2 ) ); // 12
console.log( counter( 5 ) ); // 17
console.log( counter( 3 ) ); // 20
console.log( counter( 7 ) ); // 27
console.log( counter( 1 ) ); // 28