首页 > web前端 > js教程 > JavaScript 函数调用和闭包中的括号总是只是语法糖吗?

JavaScript 函数调用和闭包中的括号总是只是语法糖吗?

DDD
发布: 2024-11-02 20:33:31
原创
535 人浏览过

Are Parentheses in JavaScript Function Calls and Closures Always Just Syntactic Sugar?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板