作者MiPony (白馬)
看板Ajax
標題[ js ] 請教一下arguments的用法
時間Wed Jul 10 11:37:20 2013
小弟最近在寫一個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)
1F:推 No:_log可以選擇用info或log來顯示。logMsg則是為了方便呼叫而已 07/10 11:50
這個我知道QQ
不過為何還要這特地用arguments
如果這樣寫:
function logMsg(msg) {
_log("debug",msg);
}
應該比較快吧??
※ 編輯: MiPony 來自: 61.220.36.130 (07/10 12:00)
2F:→ TonyQ:因為 function test(a,b) (){} 不一定表示這個 function' 07/10 14:21
3F:→ TonyQ:只能收兩個 arg 。 07/10 14:21
4F:→ TonyQ:有可能使用者實際上丟 test(1,2,3,4,5,6,7) 07/10 14:21
5F:→ TonyQ:這時候 arguments 做完 slice 之後是 [2,3,4,5,6,7] 07/10 14:21
6F:→ TonyQ:你說的這種作法則會只有 [2] 07/10 14:22
7F:→ TonyQ:會用到 arguments 一定是他認為 function 的 param 是不可靠 07/10 14:22
8F:→ TonyQ:的時候,他想要支援會多或會少的狀況。 07/10 14:22
9F:→ doggy8088:重點在於 apply() 的用法,尤其是第二個參數的地方。 07/10 15:01
11F:→ doggy8088:apply 第二的參數傳入的是 Array 物件 07/10 15:02
12F:→ doggy8088:傳入之後真正執行的 _log 會視為接到 "多個參數" 的資料 07/10 15:03
13F:→ doggy8088:然後在_log()裡面,得到的arguments就是一個單純的陣列 07/10 15:04
14F:→ doggy8088:在這兩個函式裡,msg 都沒有用到,算是個多餘的變數 07/10 15:07
15F:→ doggy8088:加上 msg 參數之後,反而讓人誤解其用途 07/10 15:08
16F:→ doggy8088:這兩個函式的第一行,可以寫成以下這樣: 07/10 15:09
17F:→ doggy8088:unction _log(mode, undefined) { 07/10 15:10
18F:→ doggy8088:function _log(mode, undefined) { 07/10 15:10
19F:→ doggy8088:function logMsg(undefined) { 07/10 15:10
感謝以上回答的版友!!
原來是有點被誤導了XD
※ 編輯: MiPony 來自: 61.220.36.130 (07/10 15:38)