为什么公共变量而不是私有变量的对象实例上下文丢失了?

时间:2013-10-09 05:48:20

标签: javascript oop

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);

3 个答案:

答案 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);