将函数放在变量中的JavaScript优势?

时间:2011-02-16 23:06:17

标签: javascript function variables

我已经看到最近的代码示例将函数放在变量中,然后像普通函数一样调用函数。

如:

var myFunctionName = function() {
    Code Here...
}

myFunctionName();

我确信更先进的场景有很多优点,但我只是很好奇。

3 个答案:

答案 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