gpt4 book ai didi

javascript - 为什么调用匿名函数表达式有两种不同的语法?

转载 作者:行者123 更新时间:2023-11-30 10:52:51 25 4
gpt4 key购买 nike

我刚刚读了Ben Alman关于 Immediately-Invoked Function Expressions 的文章并且想知道这部分,他在其中介绍了函数表达式和闭包(与 IIFE 还没有真正相关):

// ...doesn't it stand to reason that the function expression itself can
// be invoked, just by putting () after it?

function(){ /* code goes here */ }();

// This works! Well, almost. A minor JavaScript syntax issue actually
// requires that ambiguity between function declarations and function
// expressions be eliminated, which can be done by wrapping the function
// expression in parens.

// The following pattern is used universally to create an anonymous
// closure with "privacy":

(function(){ /* code goes here */ })();

// This parens syntax is also valid (I prefer the previous version):

(function(){ /* code goes here */ }());

最后一部分让我印象深刻。谁能解释为什么调用函数表达式有两种不同的语法版本?

是否有意识地引入这种语法只是为了调用匿名闭包?或者它是其他一些语法属性的副产品?

为什么第二个版本仍然有效?从解析器的 Angular 来看,第一个对我来说很有意义。第一对括号计算出一个函数对象,第二对调用这个函数对象。但是第二个?它看起来不像是在解决所提到的语法歧义。

谁能告诉我这里缺少什么?

最佳答案

所有这一切的发生都是因为 JavaScript 有两个解析上下文:表达式和语句。在语句级别编写 function foo() {} 在该范围内定义函数 foo,而在表达式级别的 function foo() {} 计算为一个新的匿名函数(可以递归调用自身为 foo)。

因此,无论何时遇到该构造,解析器都必须确定它是在表达式级别还是语句级别。默认情况下,它假定处于语句级别,除非另有说明。方括号是表示“这是一个表达式”的句法方式。

因此,编写 (function() {}) 会导致解析器将函数视为表达式。由于表达式只能包含其他表达式(无语句),因此如果您编写 (something-that-c​​ontains function(){} and-other-stuff) 那么其中的函数仍然会被视为一个表达式。

关于javascript - 为什么调用匿名函数表达式有两种不同的语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4297575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com