JavaScript 中的表达式闭包和函数调用相同吗?
在 JavaScript 中,以下代码片段似乎会产生相同的输出:
<code class="js">(function() { bar = 'bar'; alert('foo'); })(); (function() { bar = 'bar'; alert('foo'); }());</code>
两个块都执行alert('foo')语句并声明一个可在闭包外部访问的变量bar。唯一明显的区别在于闭包的语法,使用 )()} 与 }());。
这些构造在功能上等效吗?
答案:是的,它们是相同的。
其他注意事项:
如果引入附加括号,行为会发生变化。考虑以下场景:
场景 1:
<code class="js">new (function() { this.prop = 4; })().prop;</code>
此表达式创建函数类的新实例并访问新实例的 prop 属性,返回值 4。它相当于:
<code class="js">function MyClass() { this.prop = 4; } new MyClass().prop;</code>
场景 2:
<code class="js">new ( function() { return { Class: function() { } }; }() ).Class;</code>
在这种情况下,新表达式实例化函数的 Class 属性返回值。函数调用周围的括号至关重要,表明应立即调用该函数。
这相当于:
<code class="js">var namespace = { Class: function() { } }; function getNamespace() { return namespace; } new ( getNamespace() ).Class; // Or, new namespace.Class;</code>
如果从 getNamespace() 的调用中删除了括号,表达式将实例化 getNamespace 类并访问新实例的 Class 属性。
以上是JavaScript 函数调用和闭包中的括号总是只是语法糖吗?的详细内容。更多信息请关注PHP中文网其他相关文章!