javascript奇怪的行为需要解释

时间:2014-02-12 03:33:15

标签: javascript

for(i=0; i< 3; i++){
    (function(i){
        console.log(i)
    })(i);
}

我遇到了这个并且想知道它是如何工作的(我理解结果,只是想对(function(i){})(i)及其所谓的更深入的解释。 非常感谢!!!

4 个答案:

答案 0 :(得分:1)

(function(i){
    console.log(i)
})(i);

这就是所谓的自执行匿名函数,或者您不必赋予名称的函数。它也在定义后立即执行。如果查看第一组括号,它们会包含函数关键字,参数列表和函数定义,而第二组括号则是您在参数中传递的位置。

/* self-executing anonymous function definition */
(   function(i){
        console.log(i)
    }    
)

/* pass argument i into the anonymous function and execute */
(i);

我用空格分开了一点,以便更容易在视觉上分解它。

现在,因为函数参数和参数具有相同的名称,所以定义可能会让第一次看到此内容的人感到困惑。所以这是相同的例子,除了让我们将实际值传递给函数:

(function(i){
    console.log(i) // prints '5'
})(5);

答案 1 :(得分:1)

代码部分:

(function(i){
    console.log(i)
})(i);

是所谓的IIFE(立即调用的函数表达式)。

这里重要的一点是,在JavaScript中,函数是第一类对象。为了详细阐述这一点,我也可以做到以下几点:

var log = function(i) {
   console.log(i);
}

for(var i=0; i<3; i++){
   log(i);
}

在这个例子中,我将函数存储为变量,然后使用函数调用操作符()

调用它。

回到原始示例,匿名函数周围的括号实际上包含了我在日志变量中存储的内容。然后,尾随括号将调用在括号内创建的匿名函数。

答案 2 :(得分:0)

(function(i){})(i)

这是self executing function。这些内容会自动评估为返回值。这是Javascript的一个很好的功能,它需要了解。您可以通过这种方式使用它们,但它们非常适合创建范围和扩展代码的Javascript Modules

答案 3 :(得分:0)

对于循环的每次迭代,您都要创建并立即调用一个匿名函数,该函数具有i在特定迭代时的值。

请注意,如果没有传递任何参数,这将有效,因为当您调用函数时i仍处于上下文中。