在JavaScript中,为函数定义部分应用程序方法非常简单:
Function.prototype.partial = function partial() {
var fn = this
var args = Array.prototype.slice.call(arguments)
return function() {
var newArgs = Array.prototype.slice.call(arguments)
return fn.apply(this, args.concat(newArgs))
}
}
适用于各种功能:
var biggerThanFive = Math.max.partial(5)
assert biggerThanFive(x) === Math.max(5, x)
但结果函数的“this
”与原始函数不一致:
function Test() {
this.name = 'test'
}
Test.prototype.a = function(b) {
return [this.name, b]
}
var test = new Test()
test.a('x') // ['test','x']
var b = test.a.partial('y')
b() // [undefined,'y']
这可以通过手动将结果函数绑定回其原始绑定对象来修复:
var c = test.a.partial('z').bind(test)
c() //['test','z']
如何在Function.prototype.partial
定义中执行此操作? test.a
笨拙地知道它的“this
”是“测试”,那么我如何才能获得这些知识呢?
我从Esailija那里学到了什么:
JavaScript在任何其他点而不是在调用时确定函数内部的“this
”。 var d = [].concat
与var d = Array.prototype.concat
没有区别,调用d()
会在全局对象上调用它,因为它左侧没有“。”
答案 0 :(得分:1)
你做不到。
你可以使用内置的.bind
方法做到这一点,这是你最终会达到和解决的问题:
var b = test.a.bind(test, 'y')
b()
//["test", "y"]