关于Javascript中apply、call、bind要领申明

JavaScript函数存在「定义时上下文」和「运行时上下文」以及「上下文是能够转变的」如许的观点

apply和call函数

  1. call() 和 apply()都是为了转变某个函数运行时的上下文(context)而存在的,换句话说,就是为了转变函数体内部 this 的指向

  2. call()要领接收的是一个参数列表,而apply()要领接收的是一个包括多个参数的数组(或类数组对象)

    fun.apply(thisArg[, argsArray])
    参数:
        thisArg
            在 fun 函数运行时指定的 this 值。须要注重的是,指定的 this 值并不一定是该函数执行时真正的 this 值,假如这个函数处于非严厉形式下,则指定为 null 或 undefined 时会自动指向全局对象(浏览器中就是window对象),同时价为原始值(数字,字符串,布尔值)的 this 会指向该原始值的自动包装对象。
        argsArray
            一个数组或许类数组对象,个中的数组元素将作为零丁的参数传给 fun 函数。假如该参数的值为null 或 undefined,则示意不须要传入任何参数。从ECMAScript 5 最先能够运用类数组对象。浏览器兼容性请参阅本文底部内容。

    fun.call(thisArg[, arg1[, arg2[, ...]]])
    参数:
        thisArg
            在fun函数运行时指定的this值。须要注重的是,指定的this值并不一定是该函数执行时真正的this值,假如这个函数处于非严厉形式下,则指定为null和undefined的this值会自动指向全局对象(浏览器中就是window对象),同时价为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象。
            
        arg1, arg2, ...
            指定的参数列表
            
            
function a(xx, yy) {    
    alert(xx, yy);    
    alert(this);    
    alert(arguments);
}

a.apply(null, [5, 55]);
a.call(null, 5, 55);

bind函数

bind()要领会建立一个新函数,当这个新函数被挪用时,它的this值是传递给bind()的第一个参数, 它的参数是bind()的其他参数和其底本的参数

fun.bind(thisArg[, arg1[, arg2[, ...]]])
参数:
    thisArg
        当绑定函数被挪用时,该参数会作为原函数运行时的 this 指向。当运用new 操作符挪用绑定函数时,该参数无效。
    arg1, arg2, ...
        当绑定函数被挪用时,这些参数加上绑定函数本身的参数会根据递次作为原函数运行时的参数

假如有兴致想知道 Function.prototype.bind() 内部长什么样以及是怎样事情的,这里有个异常简朴的例子:

Function.prototype.bind = function (scope) {
    var fn = this;
    return function () {
        return fn.apply(scope);
    };
}

MDN为没有本身完成bind() 要领的浏览器供应了一个相对牢靠的替换计划:

if (!Function.prototype.bind) {
  Function.prototype.bind = function (oThis) {
    if (typeof this !== "function") {
      // closest thing possible to the ECMAScript 5 internal IsCallable function
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
    }
 
    var aArgs = Array.prototype.slice.call(arguments, 1), 
        fToBind = this, 
        fNOP = function () {},
        fBound = function () {
          return fToBind.apply(this instanceof fNOP && oThis
                                 ? this
                                 : oThis,
                               aArgs.concat(Array.prototype.slice.call(arguments)));
        };
 
    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();
 
    return fBound;
  };
}
    原文作者:zhangxiaohu
    原文地址: https://segmentfault.com/a/1190000006243119
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞