在 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)
但是结果函数的“<code>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
客观地知道它的“<code>this”是“test”,那么我怎样才能获得这些知识呢?
我从 Esailija 那里学到的东西:
JavaScript 不会在调用时以外的任何时候确定函数内部的“<code>this”是什么。var d = [].concat
与 没有什么不同var d = Array.prototype.concat
,并且调用d()
将在全局对象上调用它,因为“它的左侧”没有任何内容。