2014-02-12 69 views
-1
for(i=0; i< 3; i++){ 
    (function(i){ 
     console.log(i) 
    })(i); 
} 

我遇到了这个,想知道它是如何工作(我理解的结果,只是想在(function(i){})(i)和它叫什么一些深层次的解释。 感谢很多!JavaScript的奇怪行为需要解释

+0

这是一个IIFE:http://benalman.com/news/2010/11/immediately-invoked-function-expression/ –

+1

可能的重复[这是什么JavaScript代码段是什么意思?](http://stackoverflow.com/questions/6771406/what-does-this-javascript-snippet-mean) –

+0

和[JavaScript中的匿名函数如何工作?](http://stackoverflow.com/q/1140089/218196) –

回答

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); 
} 

在这个例子中,我已经存储功能作为一个变量,然后再使用该函数调用操作()

回到称它为最初的例子,匿名函数周围的圆括号确实包含了我在日志变量中存储的内容。随后的括号然后调用在括号内创建的匿名函数。

0
(function(i){})(i) 

这是一个self executing function这些自动评估内联返回一个值,这是一个很好的功能,它支付了解,你可以使用它们,但他们真的很好创建Javascript Modules范围和扩展代码。

+0

*“这些内联自动评估以返回一个值。”*我不确定“返回值”的含义。 –

0

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

请不要在没有传入任何参数的情况下工作,因为在调用函数时i仍处于上下文中。

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);