有人可以解释这两个功能之间的区别吗?
(function(Engine, $, undefined) { //hidden from scope
//public function below
Engine.Init = function() {
console.log("IM PUBLIC");
}
//anonymous functions below
function Login() {
console.log("IM PRIVATE");
}
})( window.Engine = window.Engine || {}, jQuery );
具体来说,我想知道为什么Engine.Init()
可用Console
但Login
不可用。
答案 0 :(得分:7)
Init
是引用函数的Engine
对象的属性
您可以像任何其他财产一样访问它。
Login
是匿名中的局部变量,“立即调用的函数表达式”(IIFE);与其他局部变量一样,其名称仅在声明函数
答案 1 :(得分:2)
引擎是全局因为参数:
(window.Engine = window.Engine || {}, jQuery)
并且在全局命名空间中可用,如果你这样做:
Engine.Login = function(){}
这将在全球范围内提供。
函数Login仅在匿名自执行功能的范围内可用。
答案 2 :(得分:2)
功能本身之间并没有真正的区别。唯一的区别是第一个函数被分配给在全局范围(Engine.init
)中定义的对象(window.Engine
)的属性,而第二个函数被定义为 immediately invoked function expression (IIFE)内的本地。
这是一个等效但更简单的例子:
function foo() {
// 1
window.globalFunc = function() {
// global/public
}
// 2
function localFunc() {
// local/private
}
}
foo();
因为第一个函数是显式分配给全局变量,所以在执行foo
之后,可以在foo
之外访问它。 localFunc
未导出,因此无法导出foo
,即foo
之外无法访问{<1}}。
答案 3 :(得分:0)
这件事
function(Engine, $, undefined) {
...
}
实际上是一个闭包。因此,该函数内部定义的所有内容仅在该范围内可用。当你这样做
Engine.Init = ...
您创建一个附加到Engine对象的属性。在您的情况下,Engine是一个全局对象,这意味着您可以通过控制台访问它。