function myclass()
{
var pri_var;
this.pub_var;
this.pub_func = function(which_object)
{
pri_var = which_object;
this.pub_var = which_object + " pub";
}
this.pub_func1 = function()
{
console.log(this);
alert(this.pub_var);
alert(pri_var);
}
}
instance1 = new myclass();
instance2 = new myclass();
instance1.pub_func("first");
instance2.pub_func("second");
//instance1.pub_func1();
//instance2.pub_func1();
function callCallback(callback1, callback2){
callback1("first");
callback2("second");
}
callCallback(instance1.pub_func1, instance2.pub_func1);
私有varaibleis正确注意到,但公共是未定义的,因为这指向窗口而不是myclass实例。
在类中定义的回调中访问公共变量的解决方案是什么?
可能的答案
function myclass()
{
var pri_var;
this.pub_var;
var that = this;
this.pub_func = function(which_object)
{
pri_var = which_object;
that.pub_var = which_object + " pub";
}
this.pub_func1 = function()
{
console.log(this);
alert(that.pub_var);
alert(pri_var);
}
}
instance1 = new myclass();
instance2 = new myclass();
instance1.pub_func("first");
instance2.pub_func("second");
//instance1.pub_func1();
//instance2.pub_func1();
function callCallback(callback1, callback2){
callback1("first");
callback2("second");
}
callCallback(instance1.pub_func1, instance2.pub_func1);
答案 0 :(得分:0)
在ECMAScript中,此不是“上下文”,它是执行上下文的属性,通常由如何调用函数设置,或者在ES5中由使用 bind 。我会在这个答案中忽略bind,因为你没有使用它。
当你这样做时:
callCallback(instance1.pub_func1, ...);
传递给 callCallback 的是对该函数的引用,因此当它被称为时,未设置。在ES3和ES5非严格模式下,如果未在调用中设置此,则将其设置为全局对象(浏览器中的窗口)。
所以在pub_func1
函数中:
console.log(this);
将返回全局对象,在严格模式下,它将返回undefined
。网上有很多文章解释了这个在ECMAScript中是如何工作的,读了一些,因为大多数都不是很好,如果需要,可以在这里提出更多问题。
答案 1 :(得分:0)
你的功能
this.pub_func1 = function()
{
console.log(this);
alert(this.pub_var);
alert(pri_var);
}
被要求接受此次通话的参数:
callCallback(instance1.pub_func1, instance2.pub_func1);
function callCallback(callback1, callback2){
callback1("first");
callback2("second");
}
确保您的函数设置为接受传递给它们的变量,并且RobG关于上下文的注释也是关键。但是,这个问题可能是由于语法混乱造成的。
答案 2 :(得分:0)
这个在不同的功能中没有引用相同的东西。存储对myclass的引用,然后在公共函数中使用它。
function myclass()
{
var pri_var;
var that = this;
this.pub_func = function(which_object)
{
pri_var = which_object;
that.pub_var = which_object + " pub";
}
this.pub_func1 = function()
{
console.log(that);
alert(that.pub_var);
alert(pri_var);
}
}
instance1 = new myclass();
instance2 = new myclass();
instance1.pub_func("first");
instance2.pub_func("second");
//instance1.pub_func1();
//instance2.pub_func1();
function callCallback(callback1, callback2){
callback1("first");
callback2("second");
}
callCallback(instance1.pub_func1, instance2.pub_func1);