在javascript中创建函数的不同方法

时间:2013-11-05 13:32:47

标签: javascript function runtime

首先 - 是的,我知道有很多关于这个的帖子,或者至少非常相似的帖子。看过那些我还没有找到我正在寻找的答案:

我了解到有两种主要方法可以在javascript中创建函数:

var test = function(a){
   console.log(a);
}

这是在运行时创建的,并且:

function test(a){
    console.log(a);
}

在运行时之前创建。

今天我看到了这个:

(function test(a){
    console.log(a);
})();

我以前从未见过。这个与上面两个区别的是什么?

3 个答案:

答案 0 :(得分:3)

这是立即调用函数,它会在声明后立即自行调用。

您可以在维基百科上阅读有关Immediately-invoked function expression的更多信息。

答案 1 :(得分:2)

它们之间的区别在于前两个只定义了函数,而最后一个定义并执行了函数。最后一个的典型用途是减少全局名称空间污染,因为变量将作用于函数而不是窗口。

答案 2 :(得分:2)

您的函数示例将在Javascript中考虑如下:

  1. 功能表达
  2. 功能声明
  3. 立即调用函数也称为立即调用函数表达式“IIFE”和自执行匿名函数。
  4. 你称之为“运行时”的事情是两件事。 Javascript引擎对您的代码进行两次传递。第一遍可以称为声明传递,其中标识变量和函数声明。然而,一个有趣的事情发生在第一遍中的变量,他们被称为“悬挂”但未初始化。第二遍是执行传递。这些是我认为你称之为“运行时”的两件事。

    第一个函数将发生的变化是与变量相同的行为,因为变量被分配给变量,它将被“提升”到函数上下文的顶部并声明但未初始化。所以JS会知道它的一个变量,但它被识别为未定义,直到它到达代码段'oh'将该变量初始化为函数。所以你必须等到初始化步骤之后才能使用。

    /* This is how function expression looks after 
       first pass identified but not assigned(initialized) to function 
       its hoisted and undefined just like a reg variable. */
    
    var test;
    
    //test is undefined here    
    console.log(test); 
    
    //test is initialize here
    var test = function (a) {
      console.log(a);
    }
    
    //test is recognized as a function here
    console.log(test);
    

    第二个函数将在第一遍中被声明(标识)为函数,你可以使用它,因为JS知道这个函数是一个函数。

    //this is recognized as function
    console.log(test);
    
     function test (a) {
       console.log(a);
    }
    
    //test is recognized as function here as well
    console.log(test);
    

    第三个函数将在第一次传递中声明后立即执行,并创建自己的执行上下文,包含自身。

    //test is not recognized here
    console.log(test); 
    
    (function test(a) {
      console.log(a);
    
      //surprise test is recognized here
      console.log(test);
    })();
    
    //test is not recognized here
    console.log(test);
    

    您还有匿名函数和命名函数表达式。函数在JS中非常强大。快乐编码!!