• call,apply和bind的用法及区别


    例1

     1   var name = '小王', age = 17
     2   var obj = {
     3     name: '小张',
     4     objAge: this.age,
     5     myFun: function() {
     6       console.log(this.name + '年龄:' + this.age);
     7     }
     8   }
     9 
    10   console.log(obj.objAge); //17
    11   obj.myFun() //  小张年龄:undefined

    例2

    1   var fav = '盲僧'
    2   function shows() {
    3     console.log(this.fav);
    4   }
    5   shows() //盲僧

    比较一下这两者 this 的差别,第一个打印里面的 this 指向 obj,第二个全局声明的 shows() 函数 this 是 window ;

    1.call()、apply()、bind()都可以用来改变this指向

     1   var name = '小王', age = 17
     2   var obj = {
     3     name: '小张',
     4     objAge: this.age,
     5     myFun: function () {
     6       console.log(this.name + '年龄:' + this.age);
     7     }
     8   }
     9 
    10   var dm = {
    11     name: '德玛',
    12     age: 99
    13   }
    14 
    15   obj.myFun() //小张年龄:undefined
    16   obj.myFun.call(dm)  //德玛年龄:99
    17   obj.myFun.apply(dm) //德玛年龄:99
    18   obj.myFun.bind(dm)()  //德玛年龄:99

    call和apply都是对函数的直接调用

    bind方法返回的是一个新的函数,因此后面还需要()来进行调用才可以

    2.对比call 、bind 、 apply 传参情况下

     1   var name = '小王', age = 17
     2   var obj = {
     3     name: '小张',
     4     objAge: this.age,
     5     myFun: function(from, to) {
     6       console.log(this.name + '年龄:' + this.age, '来自' + from + '去往' + to);
     7     }
     8   }
     9 
    10   var dm = {
    11     name: '德玛',
    12     age : 99
    13   }
    14   obj.myFun('成都','上海') //小张年龄:undefined 来自成都去往上海
    15   obj.myFun.call(dm, '成都', '上海')  //德玛年龄:99 来自成都去往上海
    16   obj.myFun.apply(dm, ['成都', '上海']) //德玛年龄:99 来自成都去往上海
    17   obj.myFun.bind(dm, '成都', '上海')()  //德玛年龄:99 来自成都去往上海

    第一个参数都是this要指向的对象,都可以利用后续参数传参

      call:以逗号分割传入的参数

      apply:以数组形式传入参数

      bind:同call方法

    3.当第一个参数为null或undefined时,this指向window

     1   var name = '小王', age = 17
     2   var obj = {
     3     name: '小张',
     4     objAge: this.age,
     5     myFun: function(from, to) {
     6       console.log(this.name + '年龄:' + this.age, '来自' + from + '去往' + to);
     7     }
     8   }
     9 
    10   var dm = {
    11     name: '德玛',
    12     age : 99
    13   }
    14   obj.myFun('成都','上海') //小张年龄:undefined 来自成都去往上海
    15   obj.myFun.call(null, '成都', '上海')  //小王年龄:17 来自成都去往上海
    16   obj.myFun.call(undefined, '成都', '上海')  //小王年龄:17 来自成都去往上海
    17   obj.myFun.apply(null, ['成都', '上海'])  //小王年龄:17 来自成都去往上海
    18   obj.myFun.apply(undefined, ['成都', '上海'])  //小王年龄:17 来自成都去往上海
    19   obj.myFun.bind(null, '成都', '上海')()  //小王年龄:17 来自成都去往上海
    20   obj.myFun.bind(undefined, '成都', '上海')()  //小王年龄:17 来自成都去往上海

    引用文章:https://www.runoob.com/w3cnote/js-call-apply-bind.html

  • 相关阅读:
    深入理解线程通信
    你应该知道的 volatile 关键字
    CSS-盒模型与文本溢出笔记
    Html-表单笔记
    浏览器中缓存Cache
    python-对requests请求简单的封装
    【译】MongoDb vs Mysql—以NodeJs为例
    太嚣张了!他竟用Python绕过了“验证码”
    【转】Python之道
    selenium-测试框架搭建(十三)
  • 原文地址:https://www.cnblogs.com/memeflyfly/p/14325731.html
Copyright © 2020-2023  润新知