JavaScript中的函数具有范围可见性。这意味着内部函数仅在外部函数中可见。例如: -
function outer() {
function inner() {
}
function callInner() {
inner(); // OK
}
}
inner(); // ReferenceError: inner() not defined
在Avgrund的情况下:
function Avgrund() {
function disableBlur() {
console.log('disableBlur called');
}
function print() {
// I can see other functions inside Avgrund
disableBlur();
}
}
因为在我们的例子Avgrund被定义为命名的功能,这将是在全局对象可见(window
对象浏览器)。然而,Avgrund中的命名函数在Avgrud对象本身之外是不可见的。为了获得访问这些功能,我们可以将其返回:
function Avgrund() {
function disableBlur() {
console.log('disableBlur called');
}
function print() {
// I can see other functions inside Avgrund
disableBlur();
}
return {
print: printShow
}
}
Avgrund被定义为一个构造函数(即用于创建新对象的函数)。所以Avgrund被定义但从未被执行。让我们运行这个函数然后看看会发生什么:
var avg = (function Avgrund() {
function disableBlur() {
console.log('disableBlur called');
}
function print() {
// I can see other functions inside Avgrund
disableBlur();
}
return {
print: print
}
})();
现在我们的新Avgrund的实例返回一个对象,包含引用的函数print()
Avgrund本身的内部。我们现在可以从Avgrund以外访问它:
avg.print() // disableBlur called
现在回答你的问题。正如您已经正确猜测的那样,此构造(返回一个引用内部函数的对象)用于限制对Avgrund中方法的访问。基本上定义Avgrund的公共API函数,并将它们与旨在用作私有函数的函数分开。
这种模式被称为Revealing Module Pattern
,正如misterkeg和DotNetHaggis所述。
正如其他人已经指出的那样,返回的类型是一个简单的对象。
在'object'中表示的值 – Praveen
[* MDN:* Object Literal](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Values,_variables,_and_literals#Object_literals) – Emissary
[揭示模块模式](http://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript)。 – Andy