保存';这';在异步调用之前的Javascript中

保存';这';在异步调用之前的Javascript中,javascript,Javascript,我刚刚开始学习Javascript、主干和jquery。我的同事试图用Javascript解释这个概念和上下文。他说这种模式很常见,但可能有更好的方法。我想知道这实际上是“标准”模式还是有更好的方法 基本上,这种模式是,当我在我的类中处理屏幕上看到的内容时(对我们来说,它是MVC和主干的组合),我需要获取数据来填充页面。但在我们去拿之前,我们先去拿 var _this = this; 因为我们所做的ajax调用是异步的,所以他说如果在我们的成功处理程序中 this.model.property

我刚刚开始学习Javascript、主干和jquery。我的同事试图用Javascript解释这个概念和上下文。他说这种模式很常见,但可能有更好的方法。我想知道这实际上是“标准”模式还是有更好的方法

基本上,这种模式是,当我在我的类中处理屏幕上看到的内容时(对我们来说,它是MVC和主干的组合),我需要获取数据来填充页面。但在我们去拿之前,我们先去拿

var _this = this;
因为我们所做的ajax调用是异步的,所以他说如果在我们的成功处理程序中

this.model.property = // set some property from the callback
这不是我们想要的,我们需要做的

_this.model.property = // something

我想我想知道这是不是很标准。我觉得在使用了一周的Javascript之后,每次从服务器获取数据时,有时在我尝试使用下划线u.格式化页面之前,我都会这样做,因为我猜“this”也会改变我的.每个块。谢谢

范围是javascript中最棘手的部分之一,基本上,这就是您的朋友所描述的。充分理解作用域是精通javascript的关键。查看以下链接,全面了解正在发生的事情:

  • 无论如何,我希望你喜欢javascript,它是我个人最喜欢的语言,尤其是在node.js进入我的生活之后:)

    编辑:


    要真正回答您的问题:所发生的事情是,在异步模式下,上下文正在丢失,因此
    this
    的范围发生了变化。保存它允许您以后引用它。希望这有帮助

    您可以将函数绑定到上下文,这样在异步调用期间就不必使用

    var _this = this
    //or
    var self = this;
    
    您可以使用下划线.js绑定函数:

    //this - current context
    var func = function ({ this.doSomething(); });
    var bindedFunction = _.bind(func, this);
    
    因此,当您调用bindedFunction时,它将绑定到currentContext

    如果您使用的是主干,通常我会绑定回调函数,因此它们会绑定到对象:

    var MyView = Backbone.View.extend({
            initialize: function (args) {
                _.bindAll(this, 'onDataFetched'); 
            },
            fetchData: function () {
                $.ajax({
                //... some code
                    success: this.onDataFetched
                });
            },
            onDataFetched: function(result) {
                //Do something usefull here
                //this = MyView instance
            }
    });
    

    您也可以在函数中使用u.bind来绑定this,但正如您的同事所说,在js中存储this对象是一种非常常见的模式。这是一种标准。只需确保
    \u此
    变量只是一个块变量,因此当不再使用时,它会被垃圾收集