Dojo开发:如何在另一方法的内部函数中调用Dojo类方法
问题根源
报错核心是this指向丢失:
普通函数的this由调用时的上下文决定,你直接调用fireFunct()时,内部的this默认指向全局对象(浏览器环境下为window,Node环境下为global,严格模式下为undefined),自然找不到挂载在当前实例上的_webCall方法。另外你代码中存在语法错误:return returnFunc(){}为非法写法,需要调整为合法的函数表达式。
可行解决方案
方案1:上层作用域缓存this
在onOpen顶层提前把当前实例的this存为变量,内部函数直接引用该变量即可,兼容性最好:
_webCall: function(url){ console.log(url) }, onOpen: function(){ // 缓存当前实例的this const self = this; var fireFunct = (function(){ var url = 'someurl'; var executed = false; return function(){ if(!executed){ executed = true; self._webCall(url); } } })(); fireFunct(); },
方案2:使用箭头函数继承外层this
箭头函数不会绑定独立的this,会继承外层作用域的this,直接把返回的内部函数改为箭头函数即可:
_webCall: function(url){ console.log(url) }, onOpen: function(){ var fireFunct = (function(){ var url = 'someurl'; var executed = false; // 改为箭头函数,this继承自上层onOpen的上下文 return () => { if(!executed){ executed = true; this._webCall(url); } } }).call(this); // 给IIFE绑定当前实例this,确保上层上下文正确 fireFunct(); },
方案3:调用时手动绑定this
执行fireFunct的时候用call/apply手动指定上下文为当前实例:
_webCall: function(url){ console.log(url) }, onOpen: function(){ var fireFunct = (function(){ var url = 'someurl'; var executed = false; return function(){ if(!executed){ executed = true; this._webCall(url); } } })(); // 调用时手动指定this为当前实例 fireFunct.call(this); },
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

