我正在完成这项练习" 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对象的方法。
答案 0 :(得分:0)
Strict mode是一种特殊的JavaScript模式,其中不允许使用许多不应使用的功能。这些功能包括访问函数的arguments
或caller
属性,就像您使用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";
到函数或文件的顶部,就像我在上面的代码中所做的那样。