受此Stackoverflow问题的启发,JoãoSilva的回答:setTimeout with arguments
我想知道是否有人能够向我解释这段代码与后者的区别:
// Parameter to use
var bar = 'bar';
// Go
setTimeout(
(function(arg1){
return function () {
console.log(arg1); //ya arg1 has the value: 'bar'!
}
}(bar)), 2000);
我希望括号略有不同,我知道这是一个立即调用的函数表达式(由Ben Alman创造,我相信)与闭包相结合,但我并不完全理解这段代码是如何执行的。
我正在想象一个由闭包调用的自调用匿名函数,我理解它是如何工作的,至少是温和的。
// Parameter to use
var bar = 'bar';
// Go
setTimeout(
(function(arg1){
return function () {
console.log(arg1); //ya arg1 has the value: 'bar'!
}
})(bar), 2000);
因此两者都有效,并且两个代码片段之间只有一个括号差异,而且我不再是javascript专家,但我直觉地觉得这两个javascript片段都是非常跨浏览器兼容的。但这两者之间究竟有什么不同?
答案 0 :(得分:1)
两种代码变体之间没有任何区别。
此外,实际上括号在那里是多余的。即使你用以下方式编写这段代码,它也能工作:
// Go
setTimeout(
function(arg1){ // let's get rid of braces
return function () {
console.log(arg1); //ya arg1 has the value: 'bar'!
}
}(bar), 2000);
因为FunctionExpression
概念而有效。只需要括号来区分FunctionExpression
和FunctionDeclaration
。实际上,括号可以替换为任何运算符,例如~
。
注意:甚至认为这段代码可以不加括号编写,我强烈反对这样做,因为括号现在类似于模式或关键词“Look!我是无用的括号,可能放在这里是因为立即调用这个功能“。因此,代码变得更加清晰。
网上有FunctionExpression
vs FunctionDeclaration
的大量讨论,所以我不再重复了。看看过去的SO问题:What is the difference between a function expression vs declaration in Javascript?