gpt4 book ai didi

JavaScript:使用对 "method"的引用更改行为

转载 作者:行者123 更新时间:2023-11-30 10:29:33 24 4
gpt4 key购买 nike

JavaScript 函数式编程问题。这是我的 node REPL session 的屏幕截图。为什么我的 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 ]

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

最佳答案

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

y.call(x, 4)

如果您没有正确设置this,您就不会对x 进行操作。当您创建对 x.push 的引用 y 时,该引用未绑定(bind)到 x。如果你想要 push 的绑定(bind)版本,你可以使用 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/

关于JavaScript:使用对 "method"的引用更改行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17752073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com