【问题标题】:Is this a javascript closure?这是一个 javascript 闭包吗?
【发布时间】:2012-03-22 20:19:10
【问题描述】:

我有这个....

function MyFunction() {
    var myVar = "I think I am encapsulated";

    this.getMyVar = function() {
        return myVar;
    }
}

var myProperty = new MyFunction();
console.log(myProperty.getMyVar());

myProperty.myVar = "you're not encapsulated";
console.log(myProperty.getMyVar());

它输出:“我想我被封装了两次”。为什么?我不认为这是一个关闭...

【问题讨论】:

    标签: javascript function closures


    【解决方案1】:

    闭包围绕“getMyVar”函数。构造函数内部的变量“myVar”是一个局部变量,除了“getMyVar”的返回值之外,在函数外部可见。

    在对象上设置“myVar”属性就是这样做的,但“getMyVar”函数不会返回对象的属性;它返回闭包中局部变量的值。

    【讨论】:

      【解决方案2】:

      是的。

      当您在另一个函数内部定义一个函数时,内部函数可以访问外部函数的所有局部变量...

      在您的情况下,getMyVar 可以通过闭包访问myVar

      【讨论】:

        【解决方案3】:
        var myVar = "I think I am encapsulated";
        
        this.getMyVar = function() {
            return myVar;
        }
        

        这是一个闭包,将返回从函数创建时开始myVar变量。注意它是一个局部变量,所以在这个函数退出后没有其他方法可以访问它。

        var myVar = "I think I am encapsulated";
        

        请注意,这不是this.myVar(您稍后使用myProperty.myVar 设置的变量)。

        您可能想要做的是:

        function MyFunction() {
            this.myVar = "I think I am encapsulated";
        
            this.getMyVar = function() {
                return this.myVar;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2014-10-21
          • 2013-07-10
          • 1970-01-01
          • 2010-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-02
          相关资源
          最近更新 更多