类中的这个上下文

时间:2014-10-21 11:02:04

标签: javascript

考虑关注类并调用foo方法:(jsFiddle:http://jsfiddle.net/dpvbd9LL/2/

function MyClass() {
    this.Prop = "Hello";
}

MyClass.prototype.foo = function () {
    var self = this;
    $("<p>" + self.Prop + "</p>").appendTo("#result");
}

function sampleMethod(callback) {
    // do magic stuff
    callback();
}

function executeMethod() {
    var myClass = new MyClass();
    sampleMethod(function() {
       myClass.foo(); 
    });
    sampleMethod(myClass.foo);
}

(function() {
   executeMethod();
})();

输出:

  

您好

     

未定义

如您所见,调用之间存在很大差异:

sampleMethod(function() {
   myClass.foo(); 
});

sampleMethod(myClass.foo);

为什么会这样?如何编写一个类来防止这种情况?

2 个答案:

答案 0 :(得分:0)

这是由sampleMethod(myClass.foo);传递myClass的函数但不在类上下文中,如果你测试当前对象,你会看到它是窗口,全局窗口。

如果在对象上下文中声明sampleMethod,则可以执行类似的操作。

答案 1 :(得分:0)

您可以通过将父作用域传递给匿名函数执行程序来解决此问题,如下所示:

function sampleMethod(callback, scope) {
    if(scope) scope[callback]();
    else callback();
}

function executeMethod() {
    var myClass = new MyClass();
    sampleMethod(function() {
       myClass.foo(); 
    });
    sampleMethod("foo", myClass);
}

问题是您正在尝试传递一个函数 - 对于sampleMethod-未存在的范围。所以,如果你通过了两个,你可以根据需要打电话给他们。