2011-06-23 40 views
1

我很難得到這些行使用JSLint進行驗證。我假設(也許不正確)他們實際上是有效的。下面是相關代碼:JSLint類型混淆:函數和對象與jQuery .css()

var shadowBox = $('<div/>').appendTo($(document.body)); 

// ... 

shadowBox.css({ 
    left: (e.originalEvent.clientX + 10).toString() + 'px', 
    top: e.originalEvent.clientY.toString() + 'px' 
}); 

我得到驗證錯誤是:在line

問題492字符22:類型的困惑:功能和.css:對象。

shadowBox.css({

問題在線路494字符57:類型混亂:數量和 '+':串

頂部:e.originalEvent。 clientY.toString()+'px'

我很困擾第一個,因爲這是一個相當常見的jQuery syn稅。 第二個看起來像是一個誤報,因爲我使用字符串連接字符串。

感謝

編輯

想通了這個問題:

原來JSLint的不愉快與現有的同一個文檔在這兩個語法模式:

var $var = $('<div/>', {css: {width: '15px'}}); // ONE 
$var.css({width : '20px'}); // TWO 
+0

對我來說沒有任何問題,我只需將代碼粘貼到安東尼 – davin

+0

安東尼,您能否爲每個錯誤發佈代碼的整個上下文/範圍。就像我說的那樣,它們是正確的,大概是導致問題的更廣泛的背景。 – davin

+0

嗯......我想我會在不同的環境中尋找干擾的東西。 –

回答

2

原來,JSLint增加了他們的「類型混淆」規則。

而我以爲型混亂純粹是定義爲這樣:

var a = 1; 
var b = a + 'string'; 

原來由克羅克福德先生此舉也被認爲類型混亂(我不是特別同意他的觀點)

function MyObject() { 
    this.top() { 
     return '15px'; 
    } 
} 

var anonObject = {top: '15px'}; 
var myObject = new MyObject(); 
var testString = myObject.top(); 

或jQuery中

var $b = $('<div/>').css({top: '15px'}), 
    a = $b.offset().top + 15; 

的上下文中,更簡單的例子我印象噸下帽型混淆只涉及範圍內改變值的標識符。儘管克勞福德先生似乎認爲:

來源:道格拉斯Crockford的

主題:回覆:JSLint的類型問題

要: 「安東尼S.」

日期:週四,2011年6月23日11:44

你似乎混淆了什麼類型的混亂。如果你不想 想看到的警告,那麼你不必。

0

關於第一個,是shadowBox.css其實是一個函數?你就是這樣稱呼它的。 編輯:是的,因爲這是一個普通的jQuery對象,您正確使用.css/編輯

關於第二,這看起來對我有效,雖然你不給任何上下文。

請注意,jslint不能很好地理解有效的JS,我始終建議不要使用它。

+1

不明白有效的js嗎?咦? JSLint是一個**夢幻般的**工具,不知道你認爲它有什麼缺陷,儘管如果你有可能應該報告它們。和所有需要知道何時以及如何使用它的工具一樣,但對於簡單的語法驗證來說,它是非常好的。 – davin

+0

shadowBox是一個jQuery對象,所以根據這個:http://api.jquery。COM/CSS/CSS2#阿 –

+0

,我沒有注意到,你的第一個'shadowBox'是一樣的你的第二個。是的,你正確使用'.css'。 –

3

jslint類型混淆

的JSLint可以做類型推斷。它可以報告案件是變量和屬性是用來容納多種類型。警告是類型混淆:{a}和{b}。其中{a}和{b}將被替換爲類型的名稱。

通常很容易看到是什麼引起了警告。在某些情況下,它可能非常令人費解。在令人困惑的情況下,嘗試使用鍵入的值初始化您的變量。例如,如果你期望n將包含數字,那麼寫

var n = 0; 

這應該會產生更清晰的警告。

類型混淆不一定是錯誤,特別是在提供類似這種類型的自由度的語言中。但是有些不一致就是錯誤,所以類型規範可能會考慮添加到您的編程風格中。而且,在類型混淆的情況下,最快的JavaScript引擎會減速。要關閉這些警告,請打開容忍類型混淆option

var shadowBox = $('<div/>').appendTo($(document.body)); 

// ... 

$(shadowBox).css({ 
    left: String.concat(e.originalEvent.clientX + 10).toString(), 'px'), 
    top: String.concat(e.originalEvent.clientY.toString(), 'px') 
}); 

對於第二個錯誤,你可以使用string.concat(e.originalEvent.clientY.toString(), 'PX')或忽略的錯誤。 jslint是一種檢測不良實踐的工具,但遠非完美的工具。

順便說一下,有一個js驗證器比jslint更好:jshint。它沒有先生的規則。 crockford喜歡,它有更好的JavaScript的規則。