在JavaScript中,this
完全由定義,函數如何被稱爲。 jQuery的each
函數調用你給它的迭代器函數,將this
設置爲每個元素值,因此在該迭代器函數中,this
不再引用它在該代碼的其餘部分引用的內容。
這是很容易固定在封閉的上下文中的變量:
clusters.prototype.shop_iqns_selected_class = function() {
var self = this; // <=== The variable
if(this.viewport_width < 980) {
$(this.iqns_class).each(function() {
// Do this *once*, you don't want to call $() repeatedly
var $elm = $(this);
// v---- using `self` to refer to the instance
$(self.iqn).on('click', function() {
// v---- using $elm
if($elm.hasClass('selected')) {
$elm.removeClass('selected');
} else {
$elm.addClass('selected');
}
});
});
}
}
有我繼續使用this
指每個DOM元素,但你可以接受的參數迭代器功能,所以有毫不含糊:
clusters.prototype.shop_iqns_selected_class = function() {
var self = this; // <=== The variable
if(this.viewport_width < 980) {
// Accepting the args -----------v -----v
$(this.iqns_class).each(function(index, elm) {
// Do this *once*, you don't want to call $() repeatedly
var $elm = $(elm);
// v---- using `self` to refer to the instance
$(self.iqn).on('click', function() {
// v---- using $elm
if($elm.hasClass('selected')) {
$elm.removeClass('selected');
} else {
$elm.addClass('selected');
}
});
});
}
}
更多閱讀(在我的博客中的JavaScript約this
帖):
雖然0
一個問題,將這個函數(上述)實例化所述'cluster'功能時自動運行?因爲如果符合'if()'語句,我希望發生這種情況。 – Roland
@Roland:很高興幫助。當你做'var c = new cluster();'時,你得到的對象將被'cluster.prototype'對象支持。爲了調用'shop_iqns_selected_class'函數,你可以做'c.shop_iqns_selected_class();'(注意:JS中壓倒性的慣例是使用初始封裝的名字作爲構造函數,例如'Cluster'而不是'cluster'。 ) –
我明白了,我現在正在測試,這就是爲什麼變量可能沒有任何意義。但是如果沒有我單獨啓動它,沒有辦法讓這個功能運行。 – Roland