我读到闭包末尾的()会立即执行它。那么,这两者有什么区别呢。我在一些代码中看到了第一个用法。
thanks.
for (var a=selectsomeobj(),i=0,len=a.length;i<len;++i){
(function(val){
anotherFn(val);
})(a[i]);
}
for (var a=selectsomeobj(),i=0,len=a.length;i<len;++i){
anotherFn(a[i]);
}
在此示例中没有差异。在这两种情况下,anotherFn
立即被执行。
但是,当在循环中创建函数时,通常会使用立即函数。
考虑这个例子(或多或少的伪代码):
for(var i from 1..10) {
elements[i].onclick = function() {
alert(values[i]);
}
}
由于 JavaScript 只有函数作用域,没有块作用域,因此所有事件处理程序共享相同的i
,这将具有价值10
循环结束后。所以每个处理程序都会尝试发出警报values[10]
.
通过使用立即函数,引入了一个新的作用域,它“捕获”循环变量的当前值:
for(var i from 1..10) {
(function(index) {
elements[i].onclick = function() {
alert(values[index]);
}
}(i));
}
由于这有时很难阅读,因此创建一个返回另一个函数的独立函数通常会更好:
function getHandler(value) {
return function(){alert(value);};
}
for(var i from 1..10) {
elements[i].onclick = getHandler(values[i]);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)