JavaScript方法的部分应用:如何保留“;这”;

JavaScript方法的部分应用:如何保留“;这”;,javascript,functional-programming,partials,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) retu

在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)
它适用于以下功能:

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']
如何从
函数.prototype.partial
定义中执行此操作<代码>测试。a显然知道它的“
this
”是“测试”,那么我如何获取这些知识呢


我从Esailija中学到:

JavaScript不会在调用时以外的任何时间点确定函数中的“
this
”是什么
var d=[].concat
var d=Array.prototype.concat
没有什么不同,调用
d()
将在全局对象上调用它,因为它的“左侧”没有任何内容。

您不能

不过,您可以使用内置的
.bind
方法来实现这一点,这是您最终需要解决的问题:

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

这是
This
关键字的问题,而不是您所编的“部分应用”方法的问题。调用
b()
this
的值将是全局范围(即几乎所有浏览器中的
window
),如果没有名为
name
的全局变量,则返回
undefined
。对于浏览器来说,
test.a
b
相关并不明显,因为它对解释器来说只是一个带有匿名函数的变量。是的,我知道,这就是我想要回避的:)bind可以做到,但我想从partial方法中进行分析。这就是我担心的……尽管我不喜欢从句:我知道about bind与partiaö有相似之处,但我仍然不明白为什么一个知道上下文是什么的方法不提供对它的引用。这在JS的语言设计中是一种严重的气味…@flyingsheep函数不知道它的上下文,因为它是一个一流的对象,并且是
测试。a
仅仅是指向该对象的指针。然后,多个变量和属性可以指向同一个函数,而函数不知道指向它的是什么。即使它确实知道,什么是正确的上下文选择?它被绑定到的上下文?那么你是说函数/方法只有在被调用时才知道它们的“this”指向什么?那种语言太愚蠢了@flyingsheep显然,绑定函数知道这是什么,您确实可以使用
bind
绑定函数。我说的是未绑定函数。if
test.a
是由
test.prototype.a=function(){…}定义的函数;test=new test()
,它绑定到
test
。我想用这个函数做点什么,同时保留它的绑定。