在外部触发的事件中使用原始的`this`

时间:2011-07-11 05:07:21

标签: javascript

这可以在代码中更好地解释:

var FileResourceManager = {
        LoadRequiredFiles: function (config) {
            config = config || {};

            this.OnLoading = config.onLoadingCallback;
            this.OnComplete = config.onCompleteCallback;

            //this works fine here.
            if (this.OnLoading) {
                this.OnLoading();
            }

            Modernizr.load([{
                load: 'somefile.js',
                complete: function () {
                        //Error in this callback here.
                        if (this.OnComplete) {
                            this.OnComplete();
                        }
                }
            });
        }

    };
    FileResourceManager.LoadRequiredFiles({
        onLoadingCallback: function () {
            alert('started');
        },
        onCompleteCallback: function () {
            alert('complete');
        }
    });

正如您所看到的,在Modernizr.load的complete事件的回调中,我想调用父/外对象的方法。但是this实际上成了Modernizr对象。如何在事件中访问外部对象的属性?

通过使用某种形式的绑定,我在backbone.js项目中看到了这一点。我不确定我是否需要写这样的东西。

3 个答案:

答案 0 :(得分:3)

var self = this;

Modernizr.load([{
            load: 'somefile.js',
            complete: function () {
                    //Error in this callback here.
                    if (self.OnComplete) {
                        self.OnComplete();
                    }
            }
        });

答案 1 :(得分:1)

Modernizr.load([{
            load: 'somefile.js',
            complete: (function () {
                    //Error in this callback here.
                    if (this.OnComplete) {
                        this.OnComplete();
                    }).bind(this)
            }
        });

答案 2 :(得分:0)

在Modernizr函数范围内重新定义了this对象。习惯上在范围之外定义一个名为that的变量,并使用它来引用外部this

或者,您可以使用config对象,如下所示:

complete: function () {
   if (config.OnComplete) {
     config.OnComplete();                        
   }
}