高级JavaScript:为什么这个函数被括在括号里?

2022-08-30 04:32:44

可能的重复:
JavaScript 中的 (function() { } )() 构造是什么?

我遇到了这点JavaScript代码,但我不知道该从中得到什么。为什么我在运行此代码时会得到“1”?(1)的这个奇怪的小附录是什么,为什么函数被括在括号里?

(function(x){
    delete x;
    return x;
})(1);

答案 1

这里发生了一些事情。首先是立即调用的函数表达式 (IIFE) 模式:

(function() {
  // Some code
})();

这提供了一种在其自己的范围内执行某些 JavaScript 代码的方法。通常使用它,以便在函数中创建的任何变量都不会影响全局范围。您可以改用以下命令:

function foo() {
  // Some code
}
foo();

但这需要为函数命名,这并不总是必需的。使用命名函数还意味着在将来的某个时间点可以再次调用该函数,这可能是不希望的。通过以这种方式使用匿名函数,可以确保它只执行一次。

以下语法无效:

function() {
  // Some code
}();

因为您必须将函数括在括号中才能使其解析为表达式。更多信息在这里: http://benalman.com/news/2010/11/immediately-invoked-function-expression/

因此,快速回顾一下IIFE模式:

(function() {
  // Some code
})();

允许立即执行“某些代码”,就好像它只是内联编写的一样,但也在其自己的范围内,以免影响全局命名空间(从而可能干扰其他脚本或被其他脚本干扰)。

您可以将参数传递给函数,就像将参数传递给普通函数一样,例如,

(function(x) {
  // Some code
})(1);

因此,我们将值“1”作为第一个参数传递给函数,该函数将其作为名为x的局部范围变量接收。

其次,您拥有函数代码本身的胆量:

delete x;
return x;

删除运算符将从对象中删除属性。它不会删除变量。所以;

var foo = {'bar':4, 'baz':5};
delete foo.bar;
console.log(foo);

导致记录以下内容:

{'baz':5}

var foo = 4;
delete foo;
console.log(foo);

将记录值 4,因为 foo 是一个变量而不是一个属性,所以它不能被删除。

许多人认为删除可以删除变量,因为自动全局的工作方式。如果在未先声明变量的情况下分配给该变量,则它实际上不会成为变量,而是全局对象上的属性:

bar = 4; // Note the lack of 'var'. Bad practice! Don't ever do this!
delete bar;
console.log(bar); // Error - bar is not defined.

这次删除工作正常,因为您删除的不是变量,而是全局对象上的属性。实际上,前面的代码段等效于以下内容:

window.bar = 4;
delete window.bar;
console.log(window.bar);

现在你可以看到它如何类似于foo对象示例,而不是foo变量示例。


答案 2

这意味着您创建了一个匿名函数,并使用参数 调用它。1

它与:

function foo(x) {
    delete x;
    return x;
}
foo(1);