对象的Javascript范围问题(this)

时间:2015-02-25 20:17:36

标签: javascript

我有以下代码:

var tradingInterface = function() {

    this.json = '';

    this.init = function() {

        $.get( '/whatever',{}, function(data) {
            this.json = data;
            // Rebuilds Everything
            this.rebuildAll();
        });
    };

    this.rebuildAll = function() {
        //whatever here
    };

};

为什么我在init函数中遇到以下错误?

ReferenceError: this.rebuildAll is not defined
this.rebuildAll();

为什么我可以在没有范围问题的情况下访问this.json但不能访问this.rebuildAll?

我写了一个类似的前一个帖子,但我被重定向到How to access the correct `this` / context inside a callback?,但我无法使其正常工作。

正如线程所说,我尝试了:

var tradingInterface = function() {

    this.json = '';
    var self = this;
    this.init = function() {

        $.get( '/whatever',{}, function(data) {
            this.json = data;
            // Rebuilds Everything
            self.rebuildAll();
        });
    };

    this.rebuildAll = function() {
        //whatever here
    };

};

错误消失了,但rebuildAll函数没有做它应该做的......

我需要一些帮助...

此致

1 个答案:

答案 0 :(得分:3)

  

错误消失了,但rebuildAll函数没有做它应该做的......

你没有解释rebuildAll应该做什么,所以我只能假设问题是你没有替换

this.json = data;

self.json = data;

$.get回调中,this指的是与self不同的对象。这些都在question/answer you linked to中解释。


  

为什么我可以在没有范围问题的情况下访问this.json但不能访问this.rebuildAll?

分配this.json。您(几乎)总是可以将属性分配给对象。但是,您正在阅读 this.rebuildAll并尝试将其称为函数。由于this.rebuildAllundefined,因此您无法调用它。

简化示例:

var obj = {};
obj.foo = 42; // works, foo didn't exist before
obj.bar = function() {}; // works, bar didn't exist before

obj.bar(); // works because bar exists
obj.baz(); // doesn't work, because baz doesn't exist