JS匿名范围

时间:2010-05-03 22:55:07

标签: javascript extjs scope

this
Application.EventManager.on('Click', function(args) { // event listener, args is JSON
    TestAction.getContents(args.node.id, function(result, e) { 
        console.log(result);
        this.add({
            title: args.node.id,
            html: result
        }).show();
    });
});

我真的在使用范围和匿名函数挣扎......我希望this(在第1行)与this(在第5行)相同的对象... { {1}}和.call()似乎是正确的想法,但我不想触发事件......只是改变它的范围......

对于一些上下文...有问题的.apply()是TabContainer而this是返回内容的RPC ...

...谢谢

2 个答案:

答案 0 :(得分:2)

您需要的是在外部范围内定义的变量,该变量设置为this

var that = this;
Application.EventManager.on('Click', function(args) { // event listener, args is JSON
    TestAction.getContents(args.node.id, function(result, e) { 
        console.log(result);
        that.add({
            title: args.node.id,
            html: result
        }).show();
    });
});

感谢闭包,即使在函数内部也可以这样做(错误)。

答案 1 :(得分:2)

是的,@ Joey的答案确实适用于通用JS代码。但是,由于你根据你的标签使用Ext JS,我将指出正确的方法是在适当的范围内调用事件回调函数,因为Ext处理传递和设置范围您。例如,Ext方式将是(假设您的Application类使用标准的Ext on()函数):

Application.EventManager.on('Click', function(args) { // event listener, args is JSON
    TestAction.getContents(args.node.id, function(result, e) { 
        console.log(result);
        this.add({
            title: args.node.id,
            html: result
        }).show();
    });
}, this); // 3rd arg to .on() is scope!