子函数中的arguments对象(适用于chrome控制台但不适用于其他地方)

时间:2016-10-06 01:29:49

标签: javascript arguments strict

我正在完成这项练习" Seek and Destroy"来自Free Code Camp。应该从数组中过滤出第一个参数后面的任何参数。

我提出了这个适用于chrome控制台的代码:

function destroyer(arr) {

  return arr.filter(function(x){
    for(var i = 1; i < destroyer.arguments.length; i++){
      if(x == destroyer.arguments[i]) {return false;}
    }
    return true;
  });

}

destroyer([1, 2, 3, 1, 2, 3], 2, 3); //should return [1, 1] 

在JS Bin和其他地方,它没有做任何事情。只有当我使用带有新数组的console.log而不是仅返回时,它才会起作用。当我在Free Code Camp中运行时,我得到:

  

TypeError:&#39;来电者&#39;和&#39;论证&#39;是受限制的功能属性   并且无法在此上下文中访问。

我发现这可能与严格模式有关。但它究竟意味着什么?这是说我不能在子函数中使用父函数的arguments对象吗?

如果我先将参数转换为数组然后在子函数中使用该数组,那么我可以使它在任何地方都有效。但我很好奇为什么让子函数中的参数在chrome控制台中有效但在其他地方没有,以及是否有在子函数中使用arguments对象的方法。

1 个答案:

答案 0 :(得分:0)

Strict mode是一种特殊的JavaScript模式,其中不允许使用许多不应使用的功能。这些功能包括访问函数的argumentscaller属性,就像您使用destroyer.arguments一样,这就是为什么当您尝试严格执行此操作时出现错误的原因模式。

相反,您应该在外部函数中访问arguments作为特殊变量,并将其分配给变量:

// use strict mode
"use strict";

function destroyer(arr) {
  // assign arguments to a variable that can be accessed by the inner
  // function
  var destroyerArguments = arguments;

  return arr.filter(function(x){
    // use destroyerArguments instead of destroyer.arguments
    for(var i = 1; i < destroyerArguments.length; i++){
      if(x == destroyerArguments[i]) {return false;}
    }
    return true;
  });
}

console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3)); // prints [ 1, 1 ]

请注意,默认情况下严格模式未启用,因此当您在Chrome控制台中运行代码时,不会禁止这些功能。但是,Free Code Camp可能会自动启用严格模式,因此您必须相应地设计代码。您可以通过添加行

来自行启用严格模式
"use strict";

到函数或文件的顶部,就像我在上面的代码中所做的那样。