(function() {})()
和它的特定(function($) {})(jQuery)
于jQuery 的表亲一直在 Javascript 代码中弹出。
这些结构是如何工作的,它们解决了什么问题?
示例赞赏
(function() {})()
和它的特定(function($) {})(jQuery)
于jQuery 的表亲一直在 Javascript 代码中弹出。
这些结构是如何工作的,它们解决了什么问题?
示例赞赏
随着 JavaScript 框架的日益流行,该$
标志被用于许多不同的场合。因此,为了减轻可能的冲突,您可以使用这些结构:
(function ($){
// Your code using $ here.
})(jQuery);
具体来说,这是一个匿名函数声明,它立即执行,将主要的 jQuery 对象作为参数传递。在该函数中,您可以使用$
来引用该对象,而不必担心其他框架也在范围内。
这是一种用于限制变量范围的技术;这是防止变量污染全局命名空间的唯一方法。
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
})();
1) 它定义了一个匿名函数并立即执行它。
2) 通常这样做是为了不让不需要的代码污染全局命名空间。
3)您需要从中公开一些方法,其中声明的任何内容都将是“私有的”,例如:
MyLib = (function(){
// other private stuff here
return {
init: function(){
}
};
})();
或者,或者:
MyLib = {};
(function({
MyLib.foo = function(){
}
}));
关键是,您可以通过多种方式使用它,但结果保持不变。
它只是一个立即调用的匿名函数。你可以先创建函数然后调用它,你会得到同样的效果:
(function(){ ... })();
作为:
temp = function(){ ... };
temp();
您也可以对命名函数执行相同操作:
function temp() { ... }
temp();
您调用特定于 jQuery 的代码只是在您在其中使用 jQuery 对象的意义上。它只是一个带有参数的匿名函数,它会立即被调用。
你可以分两步做同样的事情,你可以用你喜欢的任何参数来做:
temp = function(answer){ ... };
temp(42);
这解决的问题是它为函数中的代码创建了一个闭包。您可以在其中声明变量而不会污染全局命名空间,从而降低将一个脚本与另一个脚本一起使用时发生冲突的风险。
在 jQuery 的特定情况下,您在兼容模式下使用它,它不会将名称 $ 声明为 jQuery 的别名。通过将 jQuery 对象发送到闭包中并命名参数 $,您仍然可以使用与没有兼容模式相同的语法。
变量的作用域在 javascript 中的函数级别。这与您在 C# 或 Java 等语言中可能习惯的变量范围为块的情况不同。这意味着如果您在循环或 if 语句中声明一个变量,它将对整个函数可用。
如果您发现自己需要在函数内显式限定变量的范围,您可以使用匿名函数来执行此操作。您实际上可以创建一个匿名函数,然后立即执行它,并且其中的所有变量都将作用于匿名函数:
(function() {
var myProperty = "hello world";
alert(myProperty);
})();
alert(typeof(myProperty)); // undefined