如果我印象沒記錯(cuò),你這代碼可能不太全,這應(yīng)該是 underscore
的 wrap
函數(shù)
作用是包裝一個(gè)函數(shù)進(jìn)行擴(kuò)展
function wrap(func, wrapper) { return function() { var args = [func]; Array.prototype.push.apply(args, arguments); return wrapper.apply(this, args);
};
}
例子
舉個(gè)例子,現(xiàn)在有一函數(shù) greeting
可以打招呼:
function greeting() { return '你好!'}console.log(greeting()) // => 你好!
那現(xiàn)在我要現(xiàn)有函數(shù)的基礎(chǔ)下進(jìn)行擴(kuò)展,讓其能對(duì)人打招呼
var greetingTo = wrap(greeting, function(func, name) { return name + func()
})console.log(greetingTo('王大錘')) // => 王大錘你好!
原理
function wrap(func, wrapper) { // func 被包裝的函數(shù)
// wrapper 擴(kuò)展的函數(shù)
return function() { // 這邊先把被包裝的函數(shù)給放在一個(gè)數(shù)組裡
var args = [func]; // arguments 是內(nèi)建的屬性,可以取得該函數(shù)的參數(shù)
// 這裡作用等同於 args.push(arguments)
Array.prototype.push.apply(args, arguments);
// 這裡的 this 是為了保持原函數(shù)的上下文
// 被包裝後的函數(shù)是被誰呼叫的其 this 就是指向誰
// 下面舉例
return wrapper.apply(this, args);
};
}
var robot = { name: 'A-1', greeting: '你好!', hello: function() { return this.greeting
}
}
robot.hello = wrap(robot.hello, function(func, name) { // 這裡的 this 指向 robot
return name + func.bind(this)()
})console.log(robot.hello('王大錘')) // => 王大錘你好