(function() {})() 构造如何工作以及人们为什么使用它?

IT技术 javascript
2021-02-07 07:55:27

(function() {})()和它的特定(function($) {})(jQuery)jQuery 的表亲一直在 Javascript 代码中弹出。

这些结构是如何工作的,它们解决了什么问题?

示例赞赏

6个回答

随着 JavaScript 框架的日益流行,该$标志被用于许多不同的场合。因此,为了减轻可能的冲突,您可以使用这些结构:

(function ($){
  // Your code using $ here.
})(jQuery);

具体来说,这是一个匿名函数声明,它立即执行将主要的 jQuery 对象作为参数传递。在该函数中,您可以使用$来引用该对象,而不必担心其他框架也在范围内。

从技术上讲,它是一个函数表达式(!声明)。 国际金融研究所
2021-03-22 07:55:27
你能解释一下你的意思吗:“......而不用担心其他框架也在范围内。”?
2021-03-29 07:55:27
@红托邦。Javascript 范围是在函数级别定义的。函数之外的一切都在全局范围内。想想一个网页中包含了多少 Javascript。函数作用域之外的每个变量都存在碰撞危险。
2021-04-02 07:55:27
感谢您的澄清...我不清楚您指的是匿名函数的局部作用域,从全局作用域或任何其他函数的作用域无法看到该作用域。
2021-04-02 07:55:27
简短而有意义的答案。+1!
2021-04-09 07:55:27

这是一种用于限制变量范围的技术;这是防止变量污染全局命名空间的唯一方法。

var bar = 1; // bar is now part of the global namespace
alert(bar);

(function () {
   var foo = 1; // foo has function scope
   alert(foo); 
   // code to be executed goes here
})();
那么示例代码中对 Opera 的引用是不相关的/错误的?
2021-03-14 07:55:27
...并且仍然让它们对于您的代码是“全局的”。
2021-03-15 07:55:27
@Bobby:该块中可能还有其他仅用于 Opera 的变量/函数。
2021-04-10 07:55:27

1) 它定义了一个匿名函数并立即执行它。

2) 通常这样做是为了不让不需要的代码污染全局命名空间。

3)您需要从中公开一些方法,其中声明的任何内容都将是“私有的”,例如:

MyLib = (function(){
    // other private stuff here
    return {
        init: function(){
        }
    };

})();

或者,或者:

MyLib = {};
(function({
    MyLib.foo = function(){
    }
}));

关键是,您可以通过多种方式使用它,但结果保持不变。

1、这样的函数定义在一个单独的文件中,它是如何执行的?(似乎没有人调用这个函数,那么函数是如何触发的?) 2. 我没有看到顶层的函数有一个“return”语句......我正在阅读 dojo.util._doh ._browserRunner.js 谢谢!
2021-03-23 07:55:27
1)正如我所说,它自己执行,最后一个()告诉它执行。2) 它不一定有回报,它也可能在特定属性上设置值。这只是一个例子,我用另一种可能性更新了答案。
2021-03-26 07:55:27

它只是一个立即调用的匿名函数。你可以先创建函数然后调用它,你会得到同样的效果:

(function(){ ... })();

作为:

temp = function(){ ... };
temp();

您也可以对命名函数执行相同操作:

function temp() { ... }
temp();

您调用特定于 jQuery 的代码只是在您在其中使用 jQuery 对象的意义上。它只是一个带有参数的匿名函数,它会立即被调用。

你可以分两步做同样的事情,你可以用你喜欢的任何参数来做:

temp = function(answer){ ... };
temp(42);

这解决的问题是它为函数中的代码创建了一个闭包。您可以在其中声明变量而不会污染全局命名空间,从而降低将一个脚本与另一个脚本一起使用时发生冲突的风险。

在 jQuery 的特定情况下,您在兼容模式下使用它,它不会将名称 $ 声明为 jQuery 的别名。通过将 jQuery 对象发送到闭包中并命名参数 $,您仍然可以使用与没有兼容模式相同的语法。

正如我对@spoulson 的回答所评论的那样,匿名函数与闭包不同。
2021-04-03 07:55:27

在这里解释您的第一个构造为变量提供了范围。

变量的作用域在 javascript 中的函数级别。这与您在 C# 或 Java 等语言中可能习惯的变量范围为块的情况不同。这意味着如果您在循环或 if 语句中声明一个变量,它将对整个函数可用。

如果您发现自己需要在函数内显式限定变量的范围,您可以使用匿名函数来执行此操作。您实际上可以创建一个匿名函数,然后立即执行它,并且其中的所有变量都将作用于匿名函数:

(function() {
  var myProperty = "hello world";
  alert(myProperty);
})();
alert(typeof(myProperty)); // undefined