下面的代碼將打印1
:如果其中一個參數被稱爲「參數」,我可以得到`arguments`對象嗎?
(function (arguments) {
console.log(arguments);
}(1, 2));
在效果上,arguments
對象已被覆蓋。是否有可能恢復函數範圍內的默認對象arguments
?
下面的代碼將打印1
:如果其中一個參數被稱爲「參數」,我可以得到`arguments`對象嗎?
(function (arguments) {
console.log(arguments);
}(1, 2));
在效果上,arguments
對象已被覆蓋。是否有可能恢復函數範圍內的默認對象arguments
?
其實,思考關於它,你可以做到這一點!
(function (arguments) {
(function() {
console.log(arguments.callee.caller.arguments);
})();
})(1, 2);
請參閱this fiddle。
Matt在上面的評論中說「不」,我認爲他可能是對的;但你可以寫這樣的事情:
(function f(arguments) {
console.log(f.arguments);
}(1));
(至少在Firefox中,我還沒有嘗試過其他的瀏覽器,但我相信這是標準的行爲)。但是如果你不願意因爲某種原因重新命名你的函數的論點,那麼我猜你可能不願意給你的函數命名呢?
(NB以上仍然是一個函數表達式,而不是一個宣言。你仍然不能引用f
自身之外,這只是它不再是一個匿名函數表達式。)
+1不知道函數有'arguments'的實例變量。無法想象這是線程安全的,但是哦,誰在瀏覽器JS中使用線程。 – Matt 2011-12-21 22:50:54
@Matt:瀏覽器JS不支持線程(HTML5 web worker除外) – SLaks 2011-12-21 22:52:29
@Matt:Re:線程安全:我真的不知道。但它似乎至少有一些特殊的範圍規則;例如'(function f(x){if(x == 1){f(2);} alert(f.arguments [0]);})(1);'alerts'2'然後'1' (至少在Firefox中),所以當內部(遞歸調用)返回時,外部調用的'arguments'必須被恢復?我不知道這是詞法還是動態。在https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/arguments上有一個MDN頁面,我確定可以回答這些問題,但目前MDN似乎正在下降。 。 。 – ruakh 2011-12-21 22:57:32
不可以。因爲您始終完全掌握傳遞給您的參數名稱,所以不需要這樣的事情。 – Matt 2011-12-21 22:40:52
@Matt:如果你將代碼注入到別人的函數中,將'arguments'定義爲一個參數來阻止你使用它? – SLaks 2011-12-21 22:44:10
@SLaks那麼這個函數的作者會贏。 – Matt 2011-12-21 22:49:19