JSLint 测试版错误

JSLint Beta error

对于以下JS函数:

function cL() {

  'use strict';

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

}

我收到以下 JSLint 测试版错误:

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

在旧版本的 JSLint 中,我从未遇到过这个错误。
为什么新的 JSLint Beta 不喜欢这个,我该怎么做才能摆脱/抑制这个错误?

谢谢。

我需要一些时间来挖掘在 JSLint 的新 Beta 版中捕捉到这一点的变化。在保留东西 the same since last July Crockford just 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) 还在您对 p.* 的原始调用中更改了 arguments* 看看这在下面的注释中意味着什么 JSLint 确实遗漏了一些东西, 当这些失误引起他的注意时,Crockford 将这些失误归入其中。

我不相信有忽略此问题的指令,但修复过程相当轻松。

顺便说一句,因为它让我更容易理解 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 引用它们有点像大海捞针,至少从 JSLint 的角度来看是这样。这是有道理的。 function fn() 至少意味着函数中没有使用重要的参数;您只需要关心闭包上下文。 function fn(p),虽然参数名很臭,但是比较有用。我知道 某事 被传进来了,我会留意针头。 (插入 Arya Stark 参考资料。)


注:看下面的评论,我第一次完全没有解释。 arguments 是传递给函数的 整个 参数数组,这意味着 在我的初始函数重写中将 arguments 替换为 p将在第一个参数 之后丢弃任何东西。

我假设 OP 可以将所有内容打包到一个数组中而不是作为单独的参数发送,但这不是一个明显的假设,而且我没有明确假设这是正确的路线。

我的意思是:

  1. 在我的 cL(p) 版本中使用 cL(arg1, arg2, arg3);p.
  2. 中只会有 arg1
  3. var a = [arg1, arg2, arg3];cL(a); 会给出 OP 想要的,但需要先定义一个数组。
  4. 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