Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这个代码是做什么的?_Javascript - Fatal编程技术网

Javascript 这个代码是做什么的?

Javascript 这个代码是做什么的?,javascript,Javascript,我知道这是一个绑定函数。但是我不理解它和它在做什么,特别是args.concat部分。concat做什么?另外,什么是.bind方法做的.apply和.call不能做的?它似乎是一个for 但是我不理解它和它在做什么,特别是args.concat部分。康卡特做什么 连接两个或多个数组s(以及其他值到数组) 另外,.bind方法做了什么,.apply和.call做不了什么 它返回对函数的引用,其中this绑定到您想要的任何内容 Function.prototype.bind = function(

我知道这是一个绑定函数。但是我不理解它和它在做什么,特别是
args.concat
部分。
concat
做什么?另外,什么是
.bind
方法做的
.apply
.call
不能做的?

它似乎是一个for

但是我不理解它和它在做什么,特别是
args.concat
部分。康卡特做什么

连接两个或多个
数组
s(以及其他值到
数组

另外,
.bind
方法做了什么,
.apply
.call
做不了什么

它返回对函数的引用,其中
this
绑定到您想要的任何内容

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;
};

它对于套用非常有用,例如返回一个已经设置了参数的函数(除了在
bind()
中设置
this
,您还可以设置默认参数)。bind函数接受一个函数并确保它始终绑定到一个特定的
this
值。最简单的例子是事件处理程序。默认情况下,事件处理程序的
值绑定到
窗口
。但是,假设您希望使用对象的方法作为侦听器,并在该侦听器中更改某些属性:

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

// This will call `fn()` with the above `Array` as `this`.
newFn('first arg', 'second arg'); 
在onload事件中,不再像预期的那样更改
thing.answer
window.answer
现在是42。因此,我们使用
bind

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

因此,
bind
返回一个函数,该函数在被调用时调用原始函数,但使用指定的
this


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

bind
返回一个函数,
call
apply
调用一个函数,它们是不同的<代码>绑定用于确保以后将要使用的函数在特定上下文中调用,并可以选择将参数绑定到该函数。它的奇数部分(或不同部分)是向返回的函数添加一个
.bind
属性
func.bind=function(){…
因此,如果对由
.bind()
生成的函数调用
.bind()
,则原型
.bind()
将被隐藏,并且它始终仅绑定到原始函数。这与标准的
.bind()不同
…它还非常奇怪地复制了它的两个变量,以不同的名称引用同一项。它丢弃传递给绑定函数调用的参数,这些参数的索引与原始绑定参数相同。非常奇怪的函数。@patrick我立即注意到了重复。奇怪。
window.onload = thing.listener.bind(thing);