2016-10-06 52 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

相關問題