2

在 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()将在全局对象上调用它,因为“它的左侧”没有任何内容。

4

1 回答 1

1

你不能。

不过,您可以使用内置.bind方法来执行此操作,这是您最终会达到并解决的问题:

var b = test.a.bind(test, 'y')
b() 
//["test", "y"]
于 2013-06-26T15:06:17.920 回答