JavaScript方法的部分应用:如何保留“this”的含义

时间:2013-06-26 14:52:24

标签: javascript functional-programming partials

在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 = [].concatvar d = Array.prototype.concat没有区别,调用d()会在全局对象上调用它,因为它左侧没有“。”

1 个答案:

答案 0 :(得分:1)

你做不到。

你可以使用内置的.bind方法做到这一点,这是你最终会达到和解决的问题:

var b = test.a.bind(test, 'y')
b() 
//["test", "y"]