打开Spaghetti JavaScript代码

时间:2012-10-22 13:46:16

标签: javascript coding-style

我写了这样的话:

window.onload = function() {
    var a = new A();
    a.init();
};

A = function() {
    this.b = {};
};
A.prototype = {
    init : function() {
        document.writeln("init");
        this.b = new B();
        this.b.doCallback(this.init2);
    },

    init2 : function() {
        document.writeln("init2");
        this.b.say();
    }
};

B = function(){};
B.prototype = {
    doCallback: function(callback){
        callback();
    },

    say: function(){
        document.writeln("I'm B");
    }
};

对我来说输出应该如下所示:

init
init2
I'm B

但是,它看起来像是这样:

init
init2

Chrome说方法“说”未定义。有人能解释我为什么吗?

1 个答案:

答案 0 :(得分:2)

这是因为在您的代码中this不代表B的实例。

  

一个函数的关键字在JavaScript中的行为略有不同   与其他语言相比。它之间也有一些差异   严格模式和非严格模式。一般来说,对象绑定到此   在当前范围内由当前功能如何确定   在执行期间,它不能通过赋值来设置,它可以是   每次调用函数时都不同。 ES5引入了绑定   无论如何调用函数,都可以修复函数。

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/this

因此,当您致电callback init2时,this.bnull并且没有任何say方法。

如果您使用的是jQuery,则可以使用方法proxy http://api.jquery.com/jQuery.proxy/

this.b.doCallback(jQuery.proxy(this.init2,this));