You need to enable JavaScript to run this app. Dojo开发:如何在另一方法的内部函数中调用Dojo类方法
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 22:54:02