作者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)