Javascript:访问正确的范围“下”申请(...)

时间:2010-04-13 09:17:41

标签: javascript oop scope

这是一个非常古老的问题,但我似乎无法理解这里提出的其他解决方案。

我有一个对象

function ObjA() {
    var a = 1;
    this.methodA = function() {
        alert(a);
    }
}

,实例化为

var myObjA = new ObjA();

稍后,我将methodA指定为外部Javascript Framework中的处理函数,该框架使用apply(...)方法调用它。

当外部框架执行我的methodA时,this属于调用我的方法的框架函数。

由于我无法更改调用方法的方式,如何重新获得对私有变量a的访问权限?

我的研究告诉我,闭包可能是我正在寻找的。

4 个答案:

答案 0 :(得分:2)

你已经有了一个关闭。调用methodA后,对a的访问权限就可以正常使用。

对象属性与范围不同。您正在使用作用域来实现与其他语言中的“私有成员”类似的内容,但a是父作用域中的局部变量,而不是 myObjA的成员(私人或其他)。像methodA这样的函数保留对其父作用域中变量的访问权限就是'闭包'的含义。

您可以访问哪些范围是固定的:您可以随时访问父范围中的变量,但是您将被回调,并且您无法调用具有与定义范围不同的范围的函数。

由于a不是this的属性,因此在回拨时不保留this并不重要。如果你需要得到正确的this然后是,你将需要更多的工作,要么使用myObjA本身的另一个闭包:

onclick= function() { myObjA.methodA(); };

或使用Function#bind

onclick= myObjA.methodA.bind(myObjA);

答案 1 :(得分:1)

是的,你是对的。而不是方法参考

 var myObjA = new ObjA();

 libraryCallback = myObjA.methodA

传递一个闭包

 libraryCallback = function() { myObjA.methodA() }

答案 2 :(得分:0)

如果您使用的是jQuery javascript框架,最简单的方法是使用proxy

$('a').click($.proxy(myObjA, 'methodA'));

答案 3 :(得分:0)

我会这样做:

function ObjA() {
    this.a = 1;
    this.methodA = function() {
        alert(this.a);
    }
}

function bindMethod(f, o) {
    return function(){
        return f.apply(o, arguments);
    }
}

var myObjA = new ObjA();
myObjA.methodA = bindMethod(myObjA.methodA, myObjA);
...

bindMethodmethodA方法绑定为始终是myObjA的方法,同时仍然传递function() {myObjA.methodA()}不执行的任何参数。