// i = inner, o = outer, f=function, a=attribute
var singleton = function() {
var iF = function() {
return this.oA; // returns undefined
}
return {
oF: function() {
this.oA = true;
return iF();
},
oA: false
};
}();
singleton.oF();
如果单身人士是class
(如基于班级的语言),我是否应该能够通过oA
访问this.oA
?
我发现从oA
访问iF
的唯一方法是:
return singleton.oA; // returns true (as it should)
我不知道为什么,但通过oA
基础对象访问singleton
会让我觉得有点......肮脏。我错过了什么? this.oA
实际上指的是什么(在范围意义上)?
答案 0 :(得分:1)
这里的要点是 javascript中没有类。你需要没有它们。您可以仅模拟部分特征。
javascript中的this
关键字是指调用该函数的对象。如果它是全局对象this
中的函数,则引用window
。如果是constructor function
并且您使用new
关键字调用它,this
将引用当前实例。
如果你想保持oA
公开,并从私人功能访问它,你可以做一件简单的事情。
// i = inner, o = outer, f=function, a=attribute
var singleton = (function() {
// public interface
var pub = {
oF: function() {
this.oA = true;
return iF();
},
oA: false
};
// private function
var iF = function() {
return pub.oA; // returns public oA variable
}
// return public interface
return pub;
})();
请注意,我包装整个单身功能在parens 。这个惯例如此受欢迎的原因是它帮助你知道一个函数是否会立即执行(如本例所示)。想象一下,如果你的函数变大,当你查看代码时,如果singleton是一个函数或一个自调用函数返回的对象,那么就不会很明显。然而,如果你有了parens,很明显单例将是函数立即返回的东西。