2012-08-22 58 views
0

以下方法的使用有什么不同?在js节点中使用闭包

第一种方法:

for(var i = 0; i < 10; i++) { 
    (function(e){ 
     setTimeout(function() { 
      console.log(e); 
     }, 1000); 
    })(i); 
} 

for(var i = 0; i < 10; i++) { 
    createTimeoutFunction(i); 
} 

第二种方法:

function createTimeoutFunction(e){ 
    setTimeout(function() { 
     console.log(e); 
    }, 1000); 
} 

for(var i = 0; i < 10; i++) { 
    createTimeoutFunction(i); 
} 

我新的节点JS和使用闭。尽管这两种方法都返回相同的输出,但第二种方法运行时出错。我不明白为什么我们需要像第一种方法那样使用两个循环。我们不能像第二种方法那样执行吗?

+6

第一种方法是有点马车,因为'createTimeoutFunction'不存在 – EaterOfCode

+0

没有第二种方法给予什么样的错误呢? – raina77ow

+0

@ raina77ow如果我尝试在终端用于将打印第二方法上面的代码'阵列 布尔 日期 错误 的EvalError 功能 无穷 JSON 数学 的NaN 编号 对象 的RangeError 的ReferenceError 正则表达式 字符串 语法错误 类型错误 URIError decodeURI decodeURIComponent encodeURI encodeURIComponent方法 EVAL isFinite的 isNaN parseFloat parseInt函数 未定义 '10次为'函数createTimeoutFunction(E){'。这是为什么? – user850234

回答

0

闭包在JavaScript的工作,无论环境或解释您使用的是相同的。

的封闭提供了一个特定的变量范围,其中该组的代码执行。你的闭包可以访问(明显)自己定义的任何东西,以及任何封闭闭包中定义的任何对象。

与您编写了该问题存在,在第一个例子createTimeoutFunction不被任何定义 - 当你调用它,它就会失败。在这个例子中:

(function(e){ 
    setTimeout(function() { 
     console.log(e); 
    }, 1000); 
})(i); 

在这个闭包中定义的函数是一个匿名函数。它没有name属性,不能被引用。

第二个版本定义了一个全局变量createTimeoutFunction这是再因为它是全局对象的部分页面上的任何封闭访问。 (嗯,我假设,因为你没有显示这个代码被其他东西包含)。

1

在你的第一个方法取出第二for,因为除非你想在循环运行两次,它是多余的,因为一切都已经在第一发生。第二个循环失败,因为createTimeoutFunction永远不会被定义在第一个循环范围之外,与第二个方法相反。

除此之外,它们都将产生相同的结果,在第二方法中createTimeoutFunction是唯一的差别是可重复使用的。

参见:How do JavaScript closures work?