【问题标题】:JS: Difference in effect of how private functions are declaredJS:私有函数声明方式的效果差异
【发布时间】:2011-08-21 23:57:51
【问题描述】:

在这个 JS sn-p 中,我有一个带有两个版本的私有函数(bar 和 bar2)的对象。我声明了两个实例,但我发现一个版本的私有函数 (bar) 似乎错误地访问了 OTHER 对象中私有 var v 的值。谁能告诉我这是为什么?

Eric = function(_v)
{
    var v = _v;

    bar = function() {
        alert(v);
    };

    function bar2() {
        alert(v);
    };

    this.foo = function() {
        bar();
    };

    this.foo2 = function() {
        bar2();
    };
};

var e = new Eric('I am Eric');
var e2 = new Eric('I am Eric II');

e2.foo();   // outputs "I am Eric II"
e.foo();    // outputs "I am Eric II" ------ WHY?

e2.foo2();  // outputs "I am Eric II"
e.foo2();   // outputs "I am Eric"

非常感谢 安德鲁

【问题讨论】:

    标签: javascript function private


    【解决方案1】:
    bar = function() {
        alert(v);
    };
    

    您已将bar 设为全球。这意味着bar 是您调用e2 = new Eric("I am Eric II"); 中定义的第二个条形函数

    使用var bar = ... 将其设为本地来解决此问题。

    另外,您忘记了var Eric

    您也不需要在本地声明var v,因为您的构造函数参数_v 在范围内。您可以继续使用该参数。

    【讨论】:

    • 啊,我明白了!我错误地认为,因为 bar 是在 Eric 内部声明的,所以它是本地的。谢谢,Raynos,为了清除它(以及我的其他错误!:-))
    • 请注意,我仍然有点困惑,为什么 bar 是全局的,它可以访问私有变量 v。
    • @andrewk 你创建了一个本地函数。然后创建一个指向该本地函数的全局指针。这意味着该函数可以访问您的本地范围v,但您可以全局访问该函数。没有private 这样的东西。只有局部变量。
    • bar() 没有被声明,这就是为什么当Eric()(也没有被声明)第一次被调用时它变成了全局的。 bar() 引用了 v 作为闭包,因为它在 Eric() 内部初始化
    【解决方案2】:

    这是因为 bar 在第二次调用的对象上被重新定义。如果你切换到这个,它应该可以工作:

    this.bar = function() {}
    

    当然,这会破坏您想要的私有功能。 bar 不是 Eric 实例的本地符号。

    【讨论】:

      猜你喜欢
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      相关资源
      最近更新 更多