2

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

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

var _this = this;

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

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

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

_this.model.property = // something

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

4

2 回答 2

1

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

  1. Mozilla 关于函数和范围的文章
  2. 又一篇好文章

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

编辑:

实际回答您的问题:正在发生的事情是上下文在异步模式下丢失,因此this更改范围。保存它可以让您稍后引用它。希望这可以帮助!

于 2013-03-22T08:23:10.870 回答
1

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

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
        }
});
于 2013-03-22T09:34:41.863 回答