2013-12-09 67 views
0

考慮以下對象:錯誤,它失去範圍

var data = { 
    el : $('.element'), 
    value1 : this.el.data('value1') 
} 

爲什麼this失去範圍是什麼?並拋出一個錯誤?

我可以做到以下幾點,但它不是有效的,因爲我基本上選擇的div兩次:

var data = { 
    el : $('.element'), 
    value1 : $('.element').data('value1') 
} 

這適用於功能:

var data = { 
     el : $('.element'), 
     test : function() { 

     console.log(this.el) // works 
    } 

} 
+3

它完全沒有損失範圍,它根本不是你想象的那樣。你還沒有改變範圍,你使用'this'的範圍與'var data = {' –

+1

之前的行相同只是試圖澄清你的範圍問題。 當你定義「數據」時,「這個」範圍仍然是全局範圍..數據尚未定義。 javascript引擎會在數據完全評估之前嘗試評估this.el.data('value1'),因此這只是對數據的引用。 –

回答

0

使用它像

var data = { 
    el : $('.element'), 
    value1 : function() { 
     return this.el.data('value1')  
    } 
} 
console.log(data.value1());//foobar 
console.log(data.value1.call({}));//error 

var data = { 
    el : $('.element'), 
    value1 : function() { 
     return data.el.data('value1')  
    } 
} 
console.log(data.value1());//foobar 
console.log(data.value1.call({}));//foobar 

在第二種方法中,即使您調用任何範圍內的函數,該值也將始終指向數據

+0

這是否有效,我不確定這是如何工作的 - 將對象引用到自身? – webmasters

+0

如果你想在任何函數範圍內調用data.value,並且想要將'this'作爲你可以使用的數據。 – Sarath

+0

這不起作用,'data'在這一點上仍然是未定義的。 HTTP://的jsfiddle。net/Nhfdn/ –

3

試試這個:

var $element = $('.element'); 
var data = { 
    el : $element, 
    value1 : $element.data('value1') 
} 

this不屬於jQuery的,當你選擇使用jQuery的元素不會在你的範圍內改變thisthis基本對象其中包含您所使用的函數。有時候會有一些將this轉換爲DOM元素的jQuery方法,您需要閱讀文檔以瞭解您正在使用的任何方法。我們無法確定this來自這段代碼,因爲它不包含函數。

0

做這個

el = $('.element'); 
var data = { 
    el : el, 
    value1 : el.data('value1') 
} 

無論如何,這看起來奇怪,也許一些更多的上下文可以幫助它更好看(你爲什麼會傳遞一個jQuery對象,它的對象上的價值時,你可以得到價值?jQuery對象)

+0

數據對象會有很多屬性和方法 - 如果我這樣做,el會在全局聲明,這在複雜的應用程序中不是很好 - 比如使用主幹js – webmasters

1

另一種選擇,我想會是這樣:

var data = { e : $('.element'), value1: function(){return this.e.data();} }

我不是真正的快樂該解決方案,但它會完全封裝內部的數據

1

這裏的一切就是我剛纔試過:

你覺得呢?

var data = { 
    el : $('.element'), 
    initialize: function() { 

    this.mydata = this.el.data('mydata'); 
    } 
} 
+0

這很好,因爲它允許你根據需要重新初始化它,但是,我認爲我更喜歡使'mydata'成爲返回數據的函數。給他自己的。 –