javascript类问题

时间:2011-06-15 18:25:31

标签: javascript

检查此代码

    var _class=function()
    {
        this.Test=100;
        this.Callback=function(msg)
        {
            alert(msg+"\r\n"+this.Test);
        }
    }

    function run(call)
    {
        call("Hello world");
    }

    var obj=new _class();
    run(obj.Callback);

我得到了结果:

    [Alert]
    Hello world
    undefined

但是当我打电话的时候       obj.Callback(“Hello world”)

我得到了预期

    [Alert]
    Hello world
    100

为什么?

感谢您的帮助

2 个答案:

答案 0 :(得分:6)

对象与“内部”定义的函数之间没有内在关系。在函数调用中确定this(称为“接收”对象)值的唯一事物是调用函数的方式。

  • 使用object.func()调用某个函数,this将绑定到object
  • 使用“call()”或“apply()”调用函数,this由第一个参数决定。
  • 如果在没有任何隐式对象上下文的情况下调用函数,则在“回调”示例中,this将不会引用任何您的对象 - 它将引用window(或无论全局背景如何)。

诀窍在于,当你想要使用一个函数就好像它是一个对象上的“方法”时,即使函数引用已经从对象中拉出来,关系仍保持不变,你可以预先绑定this有两种方式:

  1. 您可以将该函数包装在另一个函数中,以便在闭包中明确保留this
  2. 你可以使用“.bind()”来(基本上)做同样的事情。
  3. 第一种方式如下:

    run(function() { obj.Callback(); });
    

    第二种方式如下:

    run(obj.Callback.bind(obj));
    

    在这方面,JavaScript与C#或Java等语言截然不同。在这些语言中,函数永远处于与其类(或其类的实例)的关系中。不是JavaScript;实际上,它确实无关紧要,其中定义了一个函数。如果它是这样编写的,那么你的“_class”函数将是等效的:

    function helloThere() { 
       alert(msg + "\r\n" + this.Test);
    }
    
    var _class = function() {
        this.Test = 100;
        this.Callback = helloThere;
    };
    

    编辑 - @jamietre正确地注意到你的“_class”函数包含一些var声明或本地函数,那么肯定会有区别(尽管不是关于方式this在调用“回调”时表现。)

    再次编辑 - 谢谢@Koolinc

答案 1 :(得分:1)

this.Test未定义。该上下文中的范围是回调函数。

这是一个快速修复:

var _class=function()
{
    var self = this;
    this.Test=100;
    this.Callback=function(msg)
    {
        console.log(msg+"\r\n"+self.Test);
    }
}