(heading level 1)

IIFE和JavaScript中的 (function() { } )() 构造是什么?

(p) 我想了解这个的含义:

1(function () {
2
3})();

(p) 这是否基本上等同于 document.onload


这是一个Immediately-Invoked Function Expression (IIFE)。它在创建后立即执行。

这与任何事件处理程序(如 document.onload )无关。 考虑括号内的部分:(<b>function(){}</b>)();....它是一个常规的函数表达式。然后看最后一对括号 (function(){})<b>()</b>;,这通常用于在表达式中调用一个函数;在这种情况下,我们先前的表达式。

这种模式通常用于避免污染全局命名空间,因为 IIFE 中使用的所有变量(如任何其他常规函数中的变量)在其作用域外不可见。 这可能是为什么你将此结构与 window.onload 的事件处理程序混淆,因为通常用于此:

1(function(){
2  // 你的所有代码在这里
3  var foo = function() {};
4  window.onload = foo;
5  // ...
6})();
7// 这里 foo 是不可访问的(undefined)

(Guffa 提出的更正:)

函数在创建后立即执行,而不是解析后执行。在执行其中的代码之前,会先解析整个脚本块。此外,解析代码并不意味着它会被执行,例如,如果 IIFE 处于函数内部,则在调用函数之前不会执行。

(更新) 由于这是一个非常流行的主题,值得提到的是 IIFE 也可以使用 ES6 的箭头函数来编写(如 Gajus 在评论中指出的):

1((foo) => {
2  // 在这里使用 foo
3})('foo value')

这是一个假设与你的问答原始文本一一对应的陈述性教程。

以下是摘要、内容和总结部分。注意,陈述性教程的输出格式是 Markdown 格式。

IIFE和JavaScript中的 (function() { } )() 构造

IIFE(Immediately-Invoked Function Expression)是一种在创建后立即执行的JavaScript函数。它与任何事件处理程序无关,而是用于特定的编码模式和功能。

一个IIFE的基本语法是 (function() { code })();。在这个例子中, (function() { code }) 是一个函数表达式,() 是调用这个函数的括号。

一个典型的用途是避免在全局命名空间中污染变量。在IIFE中声明的所有变量仅在其作用域内可见,并且不会与外部代码产生冲突。

以下是一个使用IIFE的示例:

1(function () {
2  var foo = 'bar';
3  console.log(foo); // 输出: bar
4})();
5console.log(foo); // 输出: ReferenceError: foo is not defined

在这个示例中,foo 是在IIFE的作用域内定义的变量,它的作用域不会超出IIFE本身。因此,外部的 console.log(foo) 语句将会报错。

IIFE还具有封装代码的作用,使其在外部无法访问。这样可以保护代码不被外部修改或破坏。只有通过将特定的变量或函数返回给外部,才能让外部代码访问到IIFE中的内容。

总结:

通过IIFE,你可以创建一个在创建后立即执行的函数,避免全局命名空间的污染,并保护代码不被外部访问和修改。这是一种常见的JavaScript编码模式,特别是在需要保护和隔离代码的场景下。


相关文章推荐