1

JavaScript 函数式编程问题。这是我的nodeREPL 会话的屏幕截图。为什么我的y(4)电话没有推入x阵列?有没有比function接近底部更简单的方法来做同样的事情?

> var x = []
undefined
> var y = x.push
undefined
> x.push(3)
1
> y(4)
2
> x
[ 3 ]
> y.call(4)
undefined
> x
[ 3 ]
> (function(data){x.push(data);})(4)  # too much typing :-)
undefined
> x
[ 3, 4 ]

如果这是一个重复的问题,请原谅;我不清楚如何搜索这种东西。

4

1 回答 1

4

第一个参数.callthis要在函数内部使用的上下文。我相信如果您改用它,它会起作用:

y.call(x, 4)

当您没有this正确设置时,您就没有采取行动x。当您创建对 的引用yx.push,该引用不会绑定到x。如果你想要一个绑定版本push,你可以var y = x.push.bind(x)按照@go-oleg(或Array.prototype.push.bind(x))的建议使用。然后y(4)会推到x


现在,问题Array.prototype.push在于它依赖于this,更适合面向对象的编程风格。我相信,一种更实用的方法将类似于以下内容(用下划线库说明):

function push(arr) {
   return arr.push.apply(arr, _.rest(arguments));
}

var x = [];
var pushToX = _.partial(push, x);

pushToX('foo', 'bar');
console.log(x); // ['foo', 'bar']

http://jsfiddle.net/hUJjz/

于 2013-07-19T17:30:25.970 回答