它通常是命名空间(见下文)并控制成员函数和/或变量的可见性。将其视为对象定义。它的技术名称是立即调用函数表达式(IIFE)。 jQuery 插件通常是这样写的。
在 Javascript 中,您可以嵌套函数。因此,以下内容是合法的:
function outerFunction() {
function innerFunction() {
// code
}
}
现在你可以打电话outerFunction()
,但可见度innerFunction()
仅限于范围outerFunction()
,这意味着它是私有的outerFunction()
。它基本上遵循与 Javascript 中的变量相同的原理:
var globalVariable;
function someFunction() {
var localVariable;
}
相应地:
function globalFunction() {
var localFunction1 = function() {
//I'm anonymous! But localFunction1 is a reference to me!
};
function localFunction2() {
//I'm named!
}
}
在上面的场景中,你可以调用globalFunction()
从任何地方,但你不能打电话localFunction1
or localFunction2
.
当你写作时你在做什么(function() { ... })()
,您是否正在将第一组括号内的代码设为函数文字(意味着整个“对象”实际上是一个函数)。之后,您将自调用该函数(最终的()
)您刚刚定义的。因此,正如我之前提到的,它的主要优点是您可以拥有私有方法/函数和属性:
(function() {
var private_var;
function private_function() {
//code
}
})();
在第一个示例中,您将显式调用globalFunction
按名称运行它。也就是说,你只需要做globalFunction()
运行它。但在上面的示例中,您不仅定义了一个函数;还定义了一个函数。你正在定义and一口气调用它。这意味着当您的 JavaScript 文件被加载时,它会立即执行。当然,你可以这样做:
function globalFunction() {
// code
}
globalFunction();
除了一个显着差异之外,行为在很大程度上是相同的:当您使用 IIFE 时,您可以避免污染全局范围(因此,这也意味着您不能多次调用该函数,因为它没有名称,但因为该函数仅在确实不存在问题时才执行)。
IIFE 的巧妙之处在于,您还可以在内部定义内容,并且只向外界公开您想要的部分(命名空间的示例,这样您基本上就可以创建自己的库/插件):
var myPlugin = (function() {
var private_var;
function private_function() {
}
return {
public_function1: function() {
},
public_function2: function() {
}
}
})()
现在你可以打电话myPlugin.public_function1()
,但您无法访问private_function()
!与类定义非常相似。为了更好地理解这一点,我推荐以下链接进行进一步阅读:
- 为你的 Javascript 命名空间
- Javascript 中的私有成员(Douglas Crockford)
EDIT
我忘了提及。在那场决赛中()
,你可以在里面传递任何你想要的东西。例如,当你创建 jQuery 插件时,你传入jQuery
or $
像这样:
(function(jQ) { ... code ... })(jQuery)
因此,您在这里所做的就是定义一个接受一个参数(称为jQ
,一个局部变量,并且已知only到该功能)。然后你自调用该函数并传入一个参数(也称为jQuery
, but this一个来自外部世界,一个是对实际 jQuery 本身的引用)。没有迫切需要这样做,但有一些优点:
- 您可以重新定义全局参数并为其指定一个在本地范围内有意义的名称。
- 有一点性能优势,因为在本地作用域中查找内容比必须沿着作用域链进入全局作用域更快。
- 压缩(缩小)有好处。
前面我描述了这些函数如何在启动时自动运行,但如果它们自动运行,谁来传递参数呢?该技术假设您需要的所有参数都已定义为全局变量。因此,如果 jQuery 尚未定义为全局变量,则此示例将无法工作。正如您可能猜到的,jquery.js 在初始化期间所做的一件事是定义一个“jQuery”全局变量,以及它更著名的“$”全局变量,这允许此代码在包含 jQuery 后工作。