首页 >web前端 >js教程 >JavaScript 中的'(function () { } ) ( )”和'(function () { } ( ) )”功能相同吗?

JavaScript 中的'(function () { } ) ( )”和'(function () { } ( ) )”功能相同吗?

Linda Hamilton
Linda Hamilton原创
2024-10-30 07:29:03768浏览

Are

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn