JavaScript 中的函数调用语法:“(function ( ) { } ) ( )”和“(function ( ) { } ( ) )”功能相同吗?
问题:
考虑以下两个 JavaScript 代码块:
(function() { bar = 'bar'; alert('foo'); })(); alert(bar);
(function() { bar = 'bar'; alert('foo'); }()); alert(bar);
两个代码块都执行alert('foo' ) 然后是alert(bar),分别显示“foo”和“bar”。两者之间的唯一区别是函数调用的语法。它们的功能相同吗?
答案:
是的,一般来说,这两个代码块在功能上是等效的。它们都会定义一个新函数,立即执行它,然后在全局范围内访问 bar 变量。
例外:
但是,存在以下边缘情况:这两种语法的行为可能不同。具体来说,如果您在函数之前或函数内的 .something 之后引入新代码,它们的行为将不再相同。
代码 1:
new (function() { this.prop = 4; }) ().prop;
此代码创建函数类的新实例并检索新实例的 prop 属性,返回 4。它相当于:
function MyClass() { this.prop = 4; } new MyClass().prop;
代码 2:
new ( function() { return { Class: function() { } }; }() ).Class;
此代码在 Class 属性上调用 new。由于函数调用的括号位于外括号内,因此它们不会触发 new 表达式,而是正常调用函数,返回其返回值。新表达式实例化 .Class 并实例化它。它相当于:
var namespace = { Class: function() { } }; function getNamespace() { return namespace; } new ( getNamespace() ).Class; //Or, new namespace.Class;
如果在调用 getNamespace() 时没有括号,此代码将被解析为 (new getNamespace()).Class,实例化 getNamespace 类并返回该类的 Class 属性新实例。
以上是JavaScript 中的“(function () { } ) ( )”和“(function () { } ( ) )”功能相同吗?的详细内容。更多信息请关注PHP中文网其他相关文章!