2015-05-09 54 views
3

對於下面的JS函數:的JSLint貝塔錯誤

function cL() { 

    'use strict'; 

    return console.log.apply(console, arguments); 

} 

我得到以下的JSLint測試版的錯誤:

Unexpected 'arguments'. 
    return console.log.apply(console, arguments); 

在舊版本的JSLint的,我從來沒有得到這個錯誤。
爲什麼新的JSLint Beta不喜歡這個,我能做些什麼來擺脫/壓制這個錯誤?

謝謝。

回答

2

對於我來說,需要一點時間才能挖掘出現在JSLint的新Beta版本中的變化。保留東西后the same since last July克羅克福德只是changed jslint.js like mad about a week ago,當測試推出。猜猜我們知道他爲什麼沉默了這麼久。

但是我在挖掘代碼中的確切位置時有以下快速版本:JSLint根本不需要你,依賴於arguments。它使得代碼(在JSLint的觀點中)更難以遵循。

說我們改變了你的代碼,以這樣的:

/*jslint white:true, devel:true */ 
function cL() { 
    'use strict'; 
    console.log(arguments[0]); 
    return console.log.apply(console, arguments); 
} 

即使在the old JSLint,你會得到:

Use a named parameter. 
    console.log(arguments[0]); 

的JSLint想要的代碼更改爲使用命名參數,至少.. 。

/*jslint white:true, devel:true */ 
function cL(p) { 
    'use strict'; 
    console.log(p[0]); 
    return console.log.apply(console, p); 
} 

這也適用於測試版。請注意,我的(natch)在原始電話中也將arguments更改爲p*請注意這是什麼意思,在下面JSLint不會錯過任何東西,而Crockford在引起他的注意時捲入了這些錯過。

我不相信有一個指令可以忽略這個問題,但修復是相當無痛的。

就FWIW,因爲它使的JSLint的心態我更容易理解,無論如何,請記住,JSLint's basic motivation is ...

When you intentionally write things that look like errors, it makes it much harder to find the real errors.

To find the needle, make your program look less like a haystack.

沒有任何聲明的參數,然後通過arguments指他們是一點點haystack-y,至少從JSLint的觀點來看。這是有道理的。至少意味着在函數中沒有重要的參數被使用;你只需要關心閉包上下文。即使參數名稱發臭,function fn(p)也更有用。我知道東西的越過,並將在尋找針。 (插入艾麗婭·史塔克參考。)


注:見下面的評論,我沒有在所有的第一次解釋。 arguments整個陣列的傳遞給函數,這意味着與替換parguments我的初始函數重寫的第一個參數之後將下降任何參數。

我是假設的OP可以收拾一切到一個數組,而不是發送作爲獨立參數,但並不是一個明顯的假設作出的,我沒有讓我的假設,這是正確的路線清晰。

這裏就是我的意思是:

  1. 使用cL(arg1, arg2, arg3);與我的版本的cL(p)只會在parg1
  2. var a = [arg1, arg2, arg3];cL(a);將給予OP想要的東西,但需要首先定義一個數組。
  3. cL([arg1, arg2, arg3]);是同樣的事情,前面的選項,但更簡潔。

這裏有一個演示:

/*jslint white:true, devel:true */ 
function cL(p) { 
    'use strict'; 
    if ("string" === typeof p) { 
    p = [p]; 
    } 
    console.log("first arg: " + p[0]); 
    return console.log.apply(console, p); 
} 

var arg1 = "a", 
    arg2 = "b", 
    arg3 = "c"; 

cL(arg1, arg2, arg3); // only arg1 is passed. 'a' is all that's output 

var a = [arg1, arg2, arg3]; 
cL(a);     // all three argX vars are passed in an array. 'abc' 

cL([arg1, arg2, arg3]); // ditto. 'abc' 

而這裏的輸出(如果你IE9-是不是沒有開發工具開啓):

first arg: a 
a 
first arg: a 
a b c 
first arg: a 
a b c 
+0

使用參數,比如'p'不消除錯誤,但是當我向它傳遞多個參數時,它也會破壞我的'cL'函數。因此,這似乎不是一個有效的解決方法。儘管你對一切的解釋都很棒。 – HartleySan

+0

'cL'有多少個不同的簽名?或者,它是字面意義上的問題,是將所有參數寫入控制檯的重新路由?根據你在做什麼,你有多大的自由與代碼,你可以改變你的電話到了'CL([P1,P2,P3])'等等。如果你想更詳細地描述使用的情況下,也許我們可以弄清楚一些巧妙的東西。 – ruffin

+0

'cL'應該只是作爲'console.log'的一個簡短別名。而已。因此,如果'console.log'可以容易地輸出儘可能多的參數,那麼'cL'也應該如此。事實是,我的'cL'功能正常工作,舊的JSLint很酷。如果唯一的問題是新的JSLint Beta不喜歡它,我很酷。我不會在'cL'聲明中寫入一堆參數來處理一些當'arguments'正常工作的東西。我希望有一個新的JSLint測試版的解決方法,但也許不是... – HartleySan