这段代码有什么作用?

问题描述 投票:0回答:2
Function.prototype.bind = function() {
    var _this = this,
        original = _this,
        args = Array.prototype.slice.call(arguments),
        _obj = args.shift(),
        func = function() {
            var _that = _obj;
            return original.apply(_that, args.concat(
            Array.prototype.slice.call(
            arguments, args.length)));
        };
    func.bind = function() {
        var args = Array.prototype.slice.call(arguments);
        return Function.prototype.bind.apply(_this, args);
    }
    return func;
};

我知道这是一个绑定函数。但我不明白它以及它在做什么,特别是

args.concat
部分。
concat
有什么作用?另外,
.bind
方法能做什么而
.apply
.call
不能呢?

javascript this
2个回答
3
投票

bind
函数接受一个函数并确保它始终绑定到特定的
this
值。最简单的例子是事件处理程序。默认情况下,事件处理程序的
this
值绑定到
window
。但是,假设您想使用对象的方法作为侦听器,并在该侦听器中更改一些属性:

var thing = {
    answer : 4,
    listener : function() {
        this.answer = 42;
    }
}
window.onload = thing.listener;

在 onload 事件中,

thing.answer
没有按预期更改,
window.answer
现在为 42。因此,我们使用
bind
:

window.onload = thing.listener.bind(thing);

因此,

bind
返回一个函数,当调用该函数时,会调用原始函数,但具有指定的
this
值。

[].concat
只是将参数添加到数组中 - 因此
[].concat(5, 4)
返回
[5, 4]
,而
[5, 4].concat([42])
返回
[5, 4, 42]
。在本例中,它用于连接参数 - 您可以将参数传递给
bind
函数,该函数将在调用函数时作为参数传递。连接起作用,以便当您调用绑定函数时,您现在传递的参数也会一起传递。


2
投票

它似乎是 Function.bind()

垫片

但我不明白它以及它在做什么,特别是

args.concat
部分。 concat 有什么作用?

Array.concat()
连接两个或多个
Array
(以及其他值到
Array
)。

另外,

.bind
方法能做什么而
.apply
.call
不能做到?

它返回对函数的引用,其中

this
绑定到您想要的任何内容。

var newFn = fn.bind(['a', 'b', 'c']);

// This will call `fn()` with the above `Array` as `this`.
newFn('first arg', 'second arg'); 

它对于柯里化很有用,例如返回一个已设置参数的函数(除了在

this
中设置
bind()
之外,您还可以设置默认参数)。

© www.soinside.com 2019 - 2024. All rights reserved.