2016-10-06 72 views
0

我正在从Free Code Camp开始练习“Seek and Destroy”。第一个数组之后的任何参数都应该从数组中过滤掉。参数对象在子功能中(在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斌和其他地方,因为它是它没有做任何事情。只有当我用一个新的数组而不是仅返回console.log时,它将工作。当我在Free Code Camp中运行它时,我得到:

TypeError: 'caller' and 'arguments' are restricted function properties and cannot be accessed in this context.

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

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

+0

不回答你为什么在控制台中工作的问题,但是请注意,如果你使内部函数成为ES6箭头函数,那么它可以访问外部函数的'arguments'对象:https:// jsfiddle。 net/aa66x552 /,但是如果你打算使用ES6语法,你可以通过使用rest参数来完全避免使用'arguments':https://jsfiddle.net/aa66x552/1/ - 或者甚至是:'''''''''''''驱动程序(arr, ... vals){return arr.filter(x => vals.indexOf(x)=== -1); }'。 – nnnnnn

回答

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"; 

给你的函数或文件的顶部使自己严格模式,因为我的代码做了上面。

+0

我也是这样做的。只是试图找出是否有可能从内部函数中访问参数。我猜这是不可能的原因是因为通过使用destroyer.arguments将意味着参数将是驱逐舰的属性,它不是? – slacle

+0

@slacle这里*是*函数中定义的函数属性'arguments';它只是[弃用](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/arguments),不推荐使用,因此您不能使用它在严格的模式。在外部函数中声明一个变量,就像我在例子中做的那样,如果你想访问外部函数的参数,你应该这样做。 – Frxstrem

相关问题