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

private 变量被正确记录,但 public 是未定义的,因为它指向 window 而不是 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);
4

3 回答 3

0

在 ECMAScript 中,不是“上下文”,它是执行上下文的属性,通常由函数的调用方式设置,或者在 ES5 中使用bind设置。由于您没有使用它,因此我将忽略此答案中的绑定。

当你这样做时:

callCallback(instance1.pub_func1, ...);

传递给callCallback的是对该函数的引用,因此当它被调用时,它的this没有设置。在 ES3 和 ES5 非严格模式下,如果在调用中未设置this,则将其设置为全局对象(浏览器中的窗口)。

所以在pub_func1功能上:

console.log(this);

将返回全局对象,并在严格模式下返回undefined. 网上有很多文章解释了在 ECMAScript 中是如何工作的,阅读一些文章,因为大多数文章本身并不是很好,如果需要,可以在这里提出更多问题。

于 2013-10-09T05:59:44.503 回答
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 关于上下文的注释也是关键。但是,此问题可能是由于语法错综复杂。

于 2013-10-09T06:01:38.153 回答
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);
于 2013-10-09T06:20:20.107 回答