使用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
相关产品推荐
相关产品推荐

