我刚刚开始使用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'会发生变化同样。谢谢!
答案 0 :(得分:1)
范围是javascript中最棘手的部分之一,基本上,这就是你的朋友所描述的内容。充分理解范围是在javascript上很棒的关键。查看其中一些链接,以全面了解发生的情况:
无论如何,我希望你喜欢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
}
});