You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Dojo Aspect环绕GridX树的expand方法时丢失this引用

解决GridX树expand方法切面中this引用丢失的问题

这个问题在使用Dojo切面包装方法时挺常见的——你遇到的this丢失,本质是因为切面返回的新函数没有正确继承原方法的上下文,导致原方法执行时this指向错误(通常是全局对象或者undefined)。

修正后的代码

只需要在调用原方法original时,用Function.prototype.call()绑定正确的this即可,同时还能保留你的条件判断逻辑:

var myGrid = ...; // 带有树形结构
var myConditional = ...; // 布尔变量
dojo.aspect.around(myGrid.tree, "expand", function(original) {
  return function(id, skip) {
    // 根据条件决定执行逻辑
    if (myConditional) {
      // 绑定当前上下文后调用原方法
      var deferred = original.call(this, id, skip);
      return deferred;
    } else {
      // 条件不满足时,返回一个仅打印日志的Deferred
      console.log("跳过expand操作");
      return new dojo.Deferred().resolve();
    }
  };
});

为什么会丢失this?

当你用aspect.around返回新函数时,这个新函数被调用时的this是由调用它的上下文决定的,而非原方法的this。比如GridX内部调用tree.expand()时,this本应指向tree对象,但你原代码里直接调用original(id, skip),相当于把original作为普通函数执行,this会指向全局对象(浏览器中是window)或严格模式下的undefined,自然就丢失了正确的上下文。

用original.call(this, id, skip)就能把当前函数的this(也就是GridX调用时传入的tree对象)绑定给原方法,保证原方法内部的this引用完全正确。

额外小提示

如果原方法参数较多或者不确定参数数量,可以用apply来传递参数数组,不用逐个写参数:

var deferred = original.apply(this, arguments);

内容的提问来源于stack exchange,提问作者Mena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:59:31