2013-03-22 46 views
2

我剛剛開始使用Javascript,backbone和jquery。我的同事試圖在Javascript中解釋這個概念和上下文。他說這種模式很常見,但可能有更好的方法來做到這一點。我想知道它是否實際上是「標準」模式,或者是否有更好的方法。在異步調用之前在Javascript中保存'this'

基本上,當我在我的課上正在處理屏幕上顯示的內容(對於我們來說,它是MVC和主幹的組合)時,我需要獲取我的數據以填充頁面。但是,我們取之前,我們做

var _this = this; 

由於Ajax調用,我們要做的就是非同步,他說,如果我們成功處理程序,如果我們這樣做

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

這不會是我們想要的東西我們需要做

_this.model.property = // something 

我想我想知道這是否非常標準。我覺得在Javascript一週後,我每次從服務器獲取數據時都會這樣做,有時在我嘗試使用下劃線的_.each格式化頁面之前,我想我的_.each塊中的「this」發生了變化以及。謝謝!

+0

您還可以使用_.bind在功能,但作爲這個綁定你的同事的工人說,這是js中一個很常見的模式來存儲這個對象。 – 2013-03-22 08:22:08

+0

這是一個標準。只要確保'_this'變量只是一個塊變量,所以當它不再被使用時它就會被垃圾收集 – Eru 2013-03-22 08:22:41

回答

1

範圍是javascript中最棘手的部分之一,基本上,這就是你的朋友正在描述的東西。充分理解範圍是在javascript中實現真棒的關鍵。檢查出一些這些鏈接什麼是發生充分的瞭解:

  1. Mozilla Article on Functions and Scope
  2. Another good article

不管怎麼說,我希望你喜歡的JavaScript,其個人我最喜歡的語言,尤其是節點之後。 JS發現到我的生活:)

編輯:

要真正回答你的問題:是什麼正在發生的是在異步模式中上下文正在丟失,因此this的範圍發生了變化。保存它可以讓你稍後參考它。希望這可以幫助!

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。

如果使用的是骨幹,平時我綁定的回調函數,所以they'r綁定到對象:

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 
     } 
});