我有一些第三方Javascript,其语句如下:
FOO = function() {
...functions() ...
return { hash }
}();
它按设计工作但我很困惑。任何人都能定义这个结构在做什么吗?创建一个类只是一种奇怪的方式吗?
答案 0 :(得分:5)
这是一种使用闭包的技术。这个成语是众所周知的,但是当你第一次看到它时会感到困惑。 FOO
被定义为最外层函数()返回的对象。注意最后的括号,这会导致函数计算并返回{ hash }
。
代码相当于
function bar() {
...functions() ...
return { hash }
};
FOO = bar();
所以FOO等于{ hash }
。这样做的好处是hash
,无论它是什么,都可以访问function()
中定义的内容。没有其他人可以访问,所以这些东西本质上是私有的。
谷歌“Javascript关闭”了解更多信息。
答案 1 :(得分:1)
Js本身并没有真正的课程,而是“原型”。这意味着在正常的类型安全意义上,没有两个对象具有相同的“类型”,并且您可以动态地将成员添加到一个实例,而另一个实例保持不受干扰。 (这就是他们所做的)。
信不信由你,他们使用的语法可能是最清晰的,因为它不会试图隐藏在一些C风格的类语法背后。
Doug Crockford的Javascript:好的部分是一个快速阅读,并且是我遇到过的最佳OOP介绍。
答案 2 :(得分:0)
你错过了一个开放的parens,但它基本上是一种通常隐藏在一个对象中的信息的方式,即一种设置私有和privelaged方法的方法。
例如
var foo = (function() {
/* function declarations */
return { /* expose only those functions you
want to expose in a returned object
*/
}
})();
看一下Papa Crockford的 Private Members in JavaScript 。这基本上是你看到的模式,但是略有不同。函数声明包含在一个自调用的匿名函数中 - 一个匿名函数,它在声明后立即执行。由于它内部的函数作用于匿名函数,因此在匿名函数执行后它们将无法访问,除非它们通过在执行匿名函数返回的对象中引用它们而创建的闭包来公开。
通常称为 the Module Pattern 。
答案 3 :(得分:0)
这实际上不是一个类,只是一个对象。我建议您阅读:http://javascript.crockford.com/survey.html
由于JavaScript没有块范围,因此(大多数情况下)您的选择是将所有变量驻留在全局或函数范围内。你的代码段的作者想要声明一些他不想在全局范围内的局部变量,所以他声明了一个匿名函数并立即执行它,返回他试图创建的对象。这样,所有变量都将在函数的范围内。
答案 4 :(得分:0)
最后的parans使它成为Module Pattern,这基本上是一种拥有对象的单个实例(Singleton)同时也使用私有变量和函数的方法。
由于存在闭包hash
,如果它本身是一个对象或函数,则可以访问在该匿名Singleton对象中声明的所有变量。