Javascript singleton:从内部函数访问外部属性

时间:2010-07-09 13:00:49

标签: javascript singleton scope closures

// 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实际上指的是什么(在范围意义上)?

1 个答案:

答案 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,很明显单例将是函数立即返回的东西。