这段代码所做的是,简单地说:创建并运行一个函数并将其返回值分配给一个变量:Module
。返回值是一个具有 1 个属性的对象:public_instance_var
,它指向变量instance_var
,或者(在更正错字之后:public_instance_var
)。此变量已声明,但未实例化。因此返回值如下所示:
Module.public_instance_var = undefined
最后一行Module.doStuff();
一点用都没有:Module 是一个没有方法的对象。当匿名函数返回时,您声明的函数将被垃圾回收。如果您想访问这些函数,则需要将它们包含在 return 语句中。阅读闭包、对象构造函数和设计模式,但我想说你所追求的代码看起来像这样:
var Module = (function()
var public_instance_var;
function doStuff () {
this.doOtherStuff();
console.log(public_instance_var); // expected: true, but logs undefined
};
function doOtherStuff() {
public_instance_var = true;
};
return {
public_instance_var: public_instance_var,
doStuff: doStuff,
doOtherStuff: doOtherStuff
};
})();
当然,这样你的变量public_instance_var
是一个公共属性,所以我猜你真正想要做的是模拟一个私有属性和方法。在这种情况下,您最终可能会得到与此类似的代码:
var Module = (function()
{
var public_instance_var;
return {
//public_instance_var: public_instance_var, remove this line
//the closure will preserve access to the variable
doStuff: function ()
{
this.doOtherStuff();//this, you're referencing the object's property
console.log('here I am');
},
doOtherStuff: function ()
{
public_instance_var = true;
//this won't work anymore:
//this.public_instance_var = true;
};
}
})();
Module.doStuff()
现在 logs here I am
,但doOtherStuff
现在也是一个公共方法。以下是您可以选择解决问题的方法:
var Module = (function()
{
var public_instance_var;
function doOtherStuff ()
{
public_instance_var = true;
};
return {
//public_instance_var: public_instance_var, remove this line
//the closure will preserve access to the variable
doStuff: function ()
{
doOtherStuff();//don't use this here, but the reference to the function exists thanks to closure
console.log('here I am');
console.log(public_instance_var);//logs true
}
};
})();
这些只是你可以用闭包和返回对象的函数做的一些非常强大的事情。
只需阅读几篇文章,比如这篇文章,还有更好的文章。谷歌这个词power constructors