这是一个非常古老的问题,但我似乎无法理解这里提出的其他解决方案。
我有一个对象
function ObjA() {
var a = 1;
this.methodA = function() {
alert(a);
}
}
,实例化为
var myObjA = new ObjA();
稍后,我将methodA
指定为外部Javascript Framework中的处理函数,该框架使用apply(...)
方法调用它。
当外部框架执行我的methodA
时,this
属于调用我的方法的框架函数。
由于我无法更改调用方法的方式,如何重新获得对私有变量a
的访问权限?
我的研究告诉我,闭包可能是我正在寻找的。 p>
答案 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);
...
bindMethod
将methodA
方法绑定为始终是myObjA
的方法,同时仍然传递function() {myObjA.methodA()}
不执行的任何参数。