[ js ] 請教一下arguments的用法

看板Ajax作者 (白馬)時間12年前 (2013/07/10 11:37), 編輯推噓1(1018)
留言19則, 3人參與, 最新討論串1/1
小弟最近在寫一個jQuery的Plugin, 在參考Dynatree這個Plugin時,發現了arguments的用法, 以下是看到其中一個覺得不了解的function: (此function主要用來Debug時,寫入Log到瀏覽器Console) 問題將在最下面敘述。 Code: ================================================================== function _log(mode, msg) { /* 移除傳入值第一項 */ var args = Array.prototype.slice.apply(arguments, [1]); var tag = "XX Plugin"; args[0] = tag + " - " + args[0]; /* Log模式 */ switch( mode ) { case "info": window.console.info.apply(window.console, args); break; default: window.console.log.apply(window.console, args); break; } } function logMsg(msg) { /* 加入debug字串到傳入值第一項mode */ Array.prototype.unshift.apply(arguments, ["debug"]); _log.apply(this, arguments); // == this._log(arguments); } ===================================================================== 以下是我的問題: 在_log()使用arguments,應該是不確定傳入參數的數量, 但是在logMsg()中,為何要使用arguments,特地加入一個mode參數, 然後在_log()又會他移除,何不直接 _log("debug",msg) ? 這樣寫法是不是有什麼用意?還是是coding的習慣? -- 小弟還是js新手,想請各位版友幫忙解惑一下,謝謝。 如果覺得排版看不懂或很醜在麻煩告知一下XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.220.36.130 ※ 編輯: MiPony 來自: 61.220.36.130 (07/10 11:39)

07/10 11:50, , 1F
_log可以選擇用info或log來顯示。logMsg則是為了方便呼叫而已
07/10 11:50, 1F
這個我知道QQ 不過為何還要這特地用arguments 如果這樣寫: function logMsg(msg) { _log("debug",msg); } 應該比較快吧?? ※ 編輯: MiPony 來自: 61.220.36.130 (07/10 12:00)

07/10 14:21, , 2F
因為 function test(a,b) (){} 不一定表示這個 function'
07/10 14:21, 2F

07/10 14:21, , 3F
只能收兩個 arg 。
07/10 14:21, 3F

07/10 14:21, , 4F
有可能使用者實際上丟 test(1,2,3,4,5,6,7)
07/10 14:21, 4F

07/10 14:21, , 5F
這時候 arguments 做完 slice 之後是 [2,3,4,5,6,7]
07/10 14:21, 5F

07/10 14:22, , 6F
你說的這種作法則會只有 [2]
07/10 14:22, 6F

07/10 14:22, , 7F
會用到 arguments 一定是他認為 function 的 param 是不可靠
07/10 14:22, 7F

07/10 14:22, , 8F
的時候,他想要支援會多或會少的狀況。
07/10 14:22, 8F

07/10 15:01, , 9F
重點在於 apply() 的用法,尤其是第二個參數的地方。
07/10 15:01, 9F

07/10 15:02, , 10F

07/10 15:02, , 11F
apply 第二的參數傳入的是 Array 物件
07/10 15:02, 11F

07/10 15:03, , 12F
傳入之後真正執行的 _log 會視為接到 "多個參數" 的資料
07/10 15:03, 12F

07/10 15:04, , 13F
然後在_log()裡面,得到的arguments就是一個單純的陣列
07/10 15:04, 13F

07/10 15:07, , 14F
在這兩個函式裡,msg 都沒有用到,算是個多餘的變數
07/10 15:07, 14F

07/10 15:08, , 15F
加上 msg 參數之後,反而讓人誤解其用途
07/10 15:08, 15F

07/10 15:09, , 16F
這兩個函式的第一行,可以寫成以下這樣:
07/10 15:09, 16F

07/10 15:10, , 17F
unction _log(mode, undefined) {
07/10 15:10, 17F

07/10 15:10, , 18F
function _log(mode, undefined) {
07/10 15:10, 18F

07/10 15:10, , 19F
function logMsg(undefined) {
07/10 15:10, 19F
感謝以上回答的版友!! 原來是有點被誤導了XD ※ 編輯: MiPony 來自: 61.220.36.130 (07/10 15:38)
文章代碼(AID): #1HtDRpSo (Ajax)
文章代碼(AID): #1HtDRpSo (Ajax)