【问题标题】:Javascript singleton: access outer attribute from inner functionJavascript单例:从内部函数访问外部属性
【发布时间】:2011-03-13 20:53:16
【问题描述】:
// 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(如在基于类的语言中),我是否应该能够通过this.oA 访问oA

我发现从iF 访问oA 的唯一方法是:

return singleton.oA; // returns true (as it should)

我不知道为什么,但是通过singleton 基础对象访问oA 让我感觉有点……脏。我错过了什么? this.oA 实际上指的是什么(从范围的角度来看)?

【问题讨论】:

  • 您遇到的问题是 this 在这种情况下指的是 window,但我不确定您在这里究竟想要什么......

标签: javascript singleton scope closures


【解决方案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;
})();​

请注意,我将整个单例 函数包装在括号中。这种约定如此流行的原因是它帮助您知道函数是否会立即执行(如本例所示)。想象一下,如果您的函数变得更大,并且当您查看代码时,如果单例是自调用函数返回的函数或对象,则 不会很明显。但是,如果你有括号,很明显单例将是函数立即返回的东西。

【讨论】:

  • 您的解决方案是正确的。也感谢您对括号的说明。
猜你喜欢
  • 1970-01-01
  • 2015-06-09
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2017-06-01
  • 1970-01-01
  • 2016-08-04
相关资源
最近更新 更多