Javascript对象中的意外范围行为

时间:2017-05-10 19:15:18

标签: javascript jquery dojo arcgis-js-api

我尽力在我的上下文之外复制错误但却失败了,所以我必须提供它。

代码:

var view;

widget = {
    activated: false,
    close: function(){
        this.view.popupManager.enabled = false;
    }
}

view = new MapView({
}).then(function(){ //then is triggered when fully loaded;
    console.log(this.popupManager) //Object!
    widget.activated = true;
    widget.view = this;
}

console.log(view.popupManager) //Undefined, not loaded yet

$('#my_button').click(function(){
    if(widget.activated){
        widget.close() //this.view.popupManager is undefined
    }
})

这是使用Esri的Javascript 4.3 API,但它似乎不是API,但我对Javascript中的范围如何工作有一些误解。

正如您所看到的,即使widget.close仅在view完全加载时调用select name, Amount, NewColumn = right('0000000000'+ convert(varchar(10),convert(int,amount*100)),10) from yourtable ,它仍会引用旧的,未完全加载的对象

我错过了什么?

1 个答案:

答案 0 :(得分:4)

这里的问题是result: [no trailing newline]; exit code: 1 并不总是你认为的那样。您的代码中有几个this,每个都不同。

欢迎JavaScript经常被误解this

在代码中

this

widget = { activated: false, close: function(){ this.view.popupManager.enabled = false; } } 会引用this

现在在widget回调中的代码中,then会引用this对象,因此您实际上是在说window。这个widget.view = window可能就是那个让你感动的人。

我怀疑你的意思是将小部件的视图设置为新视图,在这种情况下,您需要更新代码,如下所示:

this