比较预先声明和自我调用的匿名函数

时间:2012-04-05 16:32:18

标签: javascript anonymous-function

这将是一个快速的讨论,但我只是希望得到一些关于我今天早上的启示的反馈。知道这个...

var addTwoNumbers = function(intOne, intTwo) {
    if ((typeof intOne == 'number') && (typeof intTwo == 'number')) {
        document.write(intOne + intTwo);
    } else {
        document.write('Unable to perform operation.');
    }
};

addTwoNumbers(3, 4);

...表现与此基本相同......

(function(intOne, intTwo) {
    if ((typeof intOne == 'number') && (typeof intTwo == 'number')) {
        document.write(intOne + intTwo);
    } else {
        document.write('Unable to perform operation.');
    }
})(3, 4);

...是说自调用函数中的第一组括号是绕过或通过引用来解决函数执行的“工具”?实际上,()是方法的名称,而实际上并不是方法的名称?另外,因为函数是在执行时直接声明的,它是否比使用变量名引用的技术更快?只是wondrin'。

1 个答案:

答案 0 :(得分:3)

好的,这就是“自我调用函数”(实际上不是“自我调用”;有一个显式调用,而外部函数是正确的)被写入的原因(按惯例)作为带括号的子表达式。

JavaScript有两个涉及关键字function的构造:

  1. 函数声明语句,它定义一个函数对象并将其绑定到本地作用域中的名称(以及函数的本地作用域,但现在让我们忽略它):

    function foo() { /* code */ }
    
  2. 函数实例化子表达式,它在表达式的上下文中创建一个函数对象:

    var f = function() { /* code */ };
    
  3. 问题出现在你需要第二件事,并且你想要它在表达式语句的开头。当语句以<{1>开始时使用关键字{{1解析器假设你正在做 1 ,而不是 2 。因此,通过在函数 instantiation 周围引入括号 - 并记住始终允许括号表示子表达式并且不会以任何方式影响其值 - 使function关键字的使用成为可能解释为 2 以上。

    还有其他方法可以强制解析器将语句看作表达式:

    • function
    • !function() { /* code */ }();
    • 0, function() { /* code */ }();

    只是一些例子。

    至于表现,这里没有问题。我要注意的一件事是这种将标识符绑定到函数对象的方式:

    +function() { /* code */ }();

    真的不比:

    var name = function() { /* code */ };
    

    并且在某些方面它更糟糕。特别是,使用函数声明语句会给出一个将显示在堆栈跟踪中的名称,而使用function name() { /* code */ } 定义函数则不会。