作為函數函數的擴展,你需要在一個函數被呼叫時,在它的形參和實參之間,建立正確的映射關係。
先來看下面的例子:
function func1(arg1, arg2) { ... } var map = createArgumentMap(func1,'valueOfArg1', 'valueOfArg2'); console.log(map['arg1']); // writes 'valueOfArg1' console.log(map['arg2']); // writes 'valueOfArg2'
這個映射函數接收一個函數物件作為第一個參數,以及一個長度未知的實參列表,你得在這個函數物件的形參和實參列表間建立映射,用一個關聯數組表示,並返回。
實參列表和函數形參定義的順序是一樣的,而且都是有效合法的參數。
這個題目在於建立形參和實參的映射,那麼,我們就先得到函數物件的toString()字串形式,並且截取它的形參列表。
緊接著,因為實參列表長度未知,那麼利用Array.prototype.slice方法,設置它的上下文為arguments對象,從索引1處開始截取實參,獲得實參列表的數組形式。
最後,以實參列表為基準,建立關聯數組,形參為key,實參為value,並且傳回關聯數組。
這樣,這個參數映射函數就完成了。
String.prototype.trim = function(){ return this.replace(/(^\s*)|(\s*$)/g, ""); }; var findArgs = function(funcStr){ var bracket1 = funcStr.indexOf("("); var bracket2 = funcStr.indexOf(")"); var argsStr = funcStr.slice(bracket1+1,bracket2); var args = argsStr.split(","); return args.map(function(e){ return e.trim(); }); }; function createArgumentMap(func) { var args = findArgs(func.toString()); var realArgs = Array.prototype.slice.call(arguments,1); var map = {}; for(var i=0;i<realArgs.length;i++){ map[args[i]] = realArgs[i]; } return map; }
以上就是JavaScript趣題:形參與實參的映射的內容,更多相關內容請關注PHP中文網(www.php.cn)!