在异步调用之前在Javascript中保存'this'

时间:2013-03-22 08:16:23

标签: javascript

我刚刚开始使用Javascript,backbone和jquery。我的同事试图用Javascript解释这个概念和背景。他说这种模式很常见,但可能有更好的方法。我想知道它是否实际上是“标准”模式,或者是否有更好的方式。

基本上,模式是,当我在我的班级处理屏幕上正在查看的内容时(对我们来说,它是MVC和骨干网的组合),我需要获取我的数据来填充页面。但是在我们取之前,我们做了

var _this = this;

由于我们做的ajax调用是asynch,他说如果在我们的成功处理程序中,如果我们做了

this.model.property = // set some property from the callback

这不是我们想要的,我们需要做

_this.model.property = // something

我想我想知道这是不是很标准。我觉得在经过一周的Javascript之后,我每次从服务器获取数据时都会这样做,有时在我尝试用下划线的_.each格式化我的页面之前,因为我猜我的_.each块中的'this'会发生变化同样。谢谢!

2 个答案:

答案 0 :(得分:1)

范围是javascript中最棘手的部分之一,基本上,这就是你的朋友所描述的内容。充分理解范围是在javascript上很棒的关键。查看其中一些链接,以全面了解发生的情况:

  1. Mozilla Article on Functions and Scope
  2. Another good article
  3. 无论如何,我希望你喜欢javascript,它个人最喜欢的语言,特别是在node.js进入我的生活之后:)

    编辑:

    实际回答你的问题:发生的事情是异步模式中的上下文丢失,因此this的范围发生了变化。保存它可以让你以后引用它。希望这有帮助!

答案 1 :(得分:0)

您可以将函数绑定到上下文,因此在异步调用期间您不必使用烦人的

var _this = this
//or
var self = this;

您可以使用underscore.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
        }
});