有時候在封裝控件的時候在很多 Js 函數中需要獲取傳入的直接參數或者對象參數,那麼我們就需要每次都去判斷第一個對象,所以為了方便在此封裝一個函數,來獲取當前函數中的參數值:
/*------------------------------------------ * 清除字符串兩端空格,包含換行符、制表符 *------------------------------------------*/ String.prototype.Trim = function () { return this.replace(/(^[\s\n\t]+|[\s\n\t]+$)/g, ""); } /*---------------------------------------- * 獲取當前函數的參數對象 *---------------------------------------- * diffCase 是否區分大小寫,默認 false *----------------------------------------*/ function GetArgs(diffCase) { //返回參數對象 var result = new Object(); //獲取調用函數 var caller = arguments.callee.caller; if (caller == null || caller.arguments.length == 0) return result; //獲取函數的參數集合 var matchs = caller.toString().match(/\s*function[\w\s]*\(([\w\s,]*)\)/); if (matchs == null) return result; var argArray = matchs[1].split(","); //獲取參數對象 var params = caller.arguments[0]; var index = typeof (params) == "object" ? 1 : 0; if (index == 1) { for (var p in params) { for (var i = 0; i < argArray.length; i++) { var arg = argArray[i].Trim(); if (diffCase) { if (arg == p) { result[arg] = params[p]; break; } } else { if (arg.toLocaleLowerCase() == p.toLocaleLowerCase()) { result[arg] = params[p]; break; } } } } } //多個參數將第一個後面的參數覆蓋對象傳入的參數 for (var i = index; i < argArray.length && i < caller.arguments.length; i++) result[argArray[i].Trim()] = caller.arguments[i]; return result; }
調用示例:
//測試函數 function Test(name, age) { //獲取參數對象 var args = GetArgs(); alert("姓名:" + args.name + ",年齡:" + args.age); } //調用測試 Test("張三", 25); Test({ name: "李四", age: 30 }); Test({ name: "王五" }, 18);