• apply、call、bind有什么区别?


    使用 apply

        var a = {
            name : "Cherry",
    
            func1: function () {
                console.log(this.name)
            },
    
            func2: function () {
                setTimeout(  function () {
                    this.func1()
                }.apply(a),100);
            }
    
        };
    
        a.func2()            // Cherry

    使用 call

        var a = {
            name : "Cherry",
    
            func1: function () {
                console.log(this.name)
            },
    
            func2: function () {
                setTimeout(  function () {
                    this.func1()
                }.call(a),100);
            }
    
        };
    
        a.func2()            // Cherry

    使用 bind

        var a = {
            name : "Cherry",
    
            func1: function () {
                console.log(this.name)
            },
    
            func2: function () {
                setTimeout(  function () {
                    this.func1()
                }.bind(a)(),100);
            }
    
        };
    
        a.func2()            // Cherry

    apply、call、bind 区别

    刚刚我们已经介绍了 apply、call、bind 都是可以改变 this 的指向的,但是这三个函数稍有不同。

    MDN 中定义 apply 如下;

    apply() 方法调用一个函数, 其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数

    语法:

    fun.apply(thisArg, [argsArray])

    • thisArg:在 fun 函数运行时指定的 this 值。需要注意的是,指定的 this 值并不一定是该函数执行时真正的 this 值,如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的 this 会指向该原始值的自动包装对象。
    • argsArray:一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 fun 函数。如果该参数的值为null 或 undefined,则表示不需要传入任何参数。从ECMAScript 5 开始可以使用类数组对象。浏览器兼容性请参阅本文底部内容。

    apply 和 call 的区别

    其实 apply 和 call 基本类似,他们的区别只是传入的参数不同。

    call 的语法为:

    fun.call(thisArg[, arg1[, arg2[, ...]]])

    所以 apply 和 call 的区别是 call 方法接受的是若干个参数列表,而 apply 接收的是一个包含多个参数的数组。

        var a ={
            name : "Cherry",
            fn : function (a,b) {
                console.log( a + b)
            }
        }
    
        var b = a.fn;
        b.apply(a,[1,2])     // 3
        var a ={
            name : "Cherry",
            fn : function (a,b) {
                console.log( a + b)
            }
        }
    
        var b = a.fn;
        b.call(a,1,2)       // 3

    bind 和 apply、call 区别

    我们先来将刚刚的例子使用 bind 试一下
        var a ={
            name : "Cherry",
            fn : function (a,b) {
                console.log( a + b)
            }
        }
    
        var b = a.fn;
        b.bind(a,1,2)

    我们会发现并没有输出,这是为什么呢,我们来看一下 MDN 上的文档说明:

    bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。

    所以我们可以看出,bind 是创建一个新的函数,我们必须要手动去调用:

        var a ={
            name : "Cherry",
            fn : function (a,b) {
                console.log( a + b)
            }
        }
    
        var b = a.fn;
        b.bind(a,1,2)()           // 3
  • 相关阅读:
    sql随笔
    fastadmin 后台管理 时间戳字段使用
    查询优化随笔
    Hbuilder连接苹果手机
    composer安装Laravel
    php取上个月月初和月末时间戳
    fastadmin 后台view data-source关联报500错误问题
    京东宙斯平台使用方法(accesstoken,appkey,appsecret参数和SDK的获取)
    STM32的USB速度,终于确定了传输极限,为以后的产品设计提供了数据。
    上位机用USB做虚拟串口,总算抓到一个纯代码的总结了,没有坑的完美解决。
  • 原文地址:https://www.cnblogs.com/Joe-and-Joan/p/10660544.html
Copyright © 2020-2023  润新知