2011-10-25 69 views
1

以下JS代碼正在從CoffeeScript等效產生。是`this`在json回調中不可見?

我想將對象添加到滑塊小部件,這些對象的屬性來自Django REST view,沒有什麼奇特的東西,只是一個字典列表。

我對CoffeeScript和Django都很新,我不明白this的可見性。

這裏有兩個版本,一個正常,另一個不正常。

Slider.prototype.manageObject = function(itemId, colorSequence) { 
    var obj; 
    obj = this; 
    return $.getJSON("http://localhost:8000/api/?item=" + itemId, function(data) { 
    return obj.managed.push([itemId, data]); 
    }); 
}; 

Slider.prototype.manageObject = function(itemId, colorSequence) { 
    return $.getJSON("http://localhost:8000/api/?item=" + itemId, function(data) { 
    return this.managed.push([itemId, data]); 
    }); 
}; 

爲什麼?

回答

3

問題是this的值取決於上下文。它通常是指當前對象,在第二種情況下是回調函數。通過分配obj = this您保留原始參考Slider在變量obj,因此調用managed.push的作品,在第二種情況下,您正嘗試調用managed.push函數,該函數不存在回調函數。

一個真正偉大的this解釋:http://www.quirksmode.org/js/this.htmlhttp://javascriptweblog.wordpress.com/2010/08/30/understanding-javascripts-this/

0

在發出異步請求後調用該回調。因此,回調在與聲明不同的範圍內調用,並且this關鍵字將指向您所期望的其他內容。因爲它在與obj變量相同的閉包中定義,所以函數可以訪問存儲在該輔助變量中的初始值this

2

在第二版this變量$.getJSON指向jQuery對象。儘管在第一次將參考文件存儲在obj變量中,但仍需要this。然後只需訪問它。

+只是爲了更清楚,在你的代碼片段thisSlider.prototype 3號線。

+0

傢伙,謝謝大家。我會在我理解得更好的兩個答案中隨機接受一個。 – mariotomo

0

在實施例1「本」是指滑塊函數,其中如實施例2中的「本」被稱爲在由$ .getJSON執行回調()函數所以它指向$ .getJSON函數

1

Javascript沒有方法和函數之間的區別所以全部函數收到一個隱藏的this變量。在這個由你如何調用該函數確定:

功能使用點「方法」符號調用將有this設置爲合適的對象:

obj.method(args); 
//this inside method will be obj 

功能本身被稱爲收到無用this你shouls不使用。這無疑是因爲從父函數繼承這個設計錯誤會更加有用

getJson(..., function(result){ 
    //we are inside another function now 
    //it has its own useless "this" that shadows the one that you actually want 
}); 

通常workaroud是做恰恰是你的淵源一樣,由一個正常的變量設置爲原有的「本」,用而是。這是通常的做法,致電變量that

var that = this; 
getJson(..., function(){ 
    that.managed ///... 
});