javascript - Javascript 对象中的意外作用域行为

标签 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 中的工作方式的一些误解。

如您所见,即使我只在 view 完全加载时调用 widget.close,它仍然引用旧的、未完全加载的对象

我错过了什么?

最佳答案

这里的问题是this 并不总是您认为的那样。您的代码中有几个 this,每个都不一样。

欢迎来到 JavaScript 经常被误解的 this

在代码中

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

this 将引用 widget

现在在 then 回调中的代码中,this 将引用 window 对象,所以您实际上是在说 widget.view = 窗口。这个 this 可能就是让你脱颖而出的那个。

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

var view;

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

view = new MapView({
}).then(function () {
    widget.activated = true;
    widget.view = view; // set the widget's view correctly
});

$('#my_button').click(function(){
    if(widget.activated){
        widget.close();
    }
});

关于javascript - Javascript 对象中的意外作用域行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43900982/

相关文章:

javascript - 滚动时如何使DIV始终位于页面底部

javascript - 如何在 "onclick"事件期间加载外部 Javascript 文件?

mobile - 更新 dojox.mobile.Heading 标签

javascript - 获取 DOM 元素的 dojo 方法

javascript - 用另一个延迟对象解析jquery延迟对象

javascript - 动画结束后从 JavaScript 检索值

javascript - 刷新后留在同一选项卡上

javascript - jQuery .validate() 和表单 onsubmit

javascript - 如何将对象传递给innerHTML (JavaScript) 中的函数?

javascript - 为什么 $(document).on(..) 可以放在页面上的任何位置,而 $ (".cl").on(..) 必须放在 $(document).ready 回调中或 <body> 之后?