Javascript JSLint测试错误

Javascript JSLint测试错误,javascript,arguments,jslint,console.log,beta,Javascript,Arguments,Jslint,Console.log,Beta,对于以下JS函数: function cL() { 'use strict'; return console.log.apply(console, arguments); } 我得到以下JSLint测试版错误: Unexpected 'arguments'. return console.log.apply(console, arguments); 在旧版本的JSLint中,我从未遇到过这个错误。 为什么新的JSLint测试版不喜欢这个,我可以做些什么来消除/抑制这个错误

对于以下JS函数:

function cL() {

  'use strict';

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

}
我得到以下JSLint测试版错误:

Unexpected 'arguments'.
  return console.log.apply(console, arguments);
在旧版本的JSLint中,我从未遇到过这个错误。
为什么新的JSLint测试版不喜欢这个,我可以做些什么来消除/抑制这个错误


谢谢。

我需要一段时间才能在新的测试版JSLint中挖掘出这些变化。在保留了Crockford的东西之后,测试版被推出了。我想我们知道他为什么沉默了这么久

但在我挖掘代码中的确切位置时,这里有一个快速版本:JSLint根本不希望您依赖
参数。这使得代码(在JSLint看来)更难遵循

假设我们将您的代码更改为:

/*jslint white:true, devel:true */
function cL() {
  'use strict';
  console.log(arguments[0]);
  return console.log.apply(console, arguments);
}
即使是这样,你也会得到:

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
的原始调用中也更改了
参数
。*请参见注释中的这一点,在下面的注释中,JSLint确实遗漏了一些内容,Crockford会在这些遗漏引起他的注意时滚动

我不相信有一个指令可以忽略这个问题,但是修复是相当轻松的

只是fwiw,因为它让我更容易理解JSLint的心态,无论如何,请记住

当你故意写一些看起来像是错误的东西时,它会让你犯错误 更难找到真正的错误

要找到针,请使您的程序看起来不像一个干草堆

没有任何声明的参数,然后通过
参数
引用它们,至少从JSLint的角度来看,这有点草垛式的。这是有道理的<代码>函数fn()
至少意味着函数中没有使用重要参数;您只需要关注闭包上下文<代码>函数fn(p),即使参数名很臭,也更有用。我知道有东西传进来了,我会留心针头的。(插入Arya Stark参考。)


注意:见下面的评论,我第一次没有解释
arguments
是传递到函数中的整个参数数组,这意味着在我的初始函数中用
p
替换
arguments
将删除第一个参数之后的任何内容

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

我的意思是:

  • 使用
    cL(arg1、arg2、arg3)cL(p)
    版本的code>只能在
    p
    中使用
    arg1
  • var a=[arg1、arg2、arg3];cL(a)
    将给出OP想要的内容,但首先需要定义一个数组
  • 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上-没有打开开发工具):


    使用像
    p
    这样的参数确实可以消除错误,但每当我向
    cL
    函数传递多个参数时,它也会中断该函数。因此,这似乎不是一个有效的解决办法。你对每件事的解释都很好。
    cL
    有多少不同的签名?或者,这就是您在问题中所遇到的,将所有参数写入控制台的重新路由?根据您在做什么以及您对代码的自由度,您可以将调用更改为
    cL([p1、p2、p3])
    等。。如果您想更详细地描述用例,也许我们可以想出一些巧妙的方法。
    cL
    应该只是作为
    console.log
    的一个简短别名。就这样。因此,如果
    console.log
    可以轻松地输出任意多的参数,那么
    cL
    也应该如此。事实上,我的
    cL
    函数可以正常工作,旧的JSLint对它很酷。如果唯一的问题是新的JSLint测试版不喜欢它,那么我不介意。我不打算在
    cL
    声明中编写一组参数来处理
    参数
    正常工作时的一组内容。我希望有一个新的JSLint测试版的解决方案,但也许没有…对不起,我被赶上了。费尽心机地说您的旧用法很好(Crockford并不在意):
    但是,请注意,arguments对象存在有效的用例。JSLint仅在您试图通过数字索引访问它的属性时发出警告。
    interest。也许值得追踪测试版中发生的变化,看看Crockford是否有意做出这种改变。他是,但他可能会说,“不要使用别名
    console.log
    ”,然后就不用它了非常感谢你关注这一点,鲁芬,并彻底调查了它。我对你的回答很满意,尽管这不是我想要的答案,但它完全有道理,所以我会将你的答案标记为正确。
    first arg: a
    a
    first arg: a
    a b c
    first arg: a
    a b c