zoukankan      html  css  js  c++  java
  • call apply bind的区别

    都是天生自带的内置方法(Function.prototype),所有的函数都可以调取这三个方法,改变this指向

    call 语法:fn.call(context,para1......) 把fn方法执行。并且让fn方法中的this变为context,而para1....都是给fn传递的实参(第一个参数永远是this,后面的参数是实参)

    非严格模式 call方法的几个特殊性:

    fn.call() =>this:window

    fn.call(null) =>this:window

    fn.call(undefined) =>this:window

    严格模式

    "use strict "

    fn.call() =>this:undefined

    fn.call(null) =>this:null

    fn.call(undefined) =>this:undefined

    (第一个参数传谁就是谁,不传就是undefined)

    apply

    apply的语法和call基本一致,作用原理也基本一致,唯一的区别:apply把传递给函数的实参以数组形式存放(但是也相当于在给函数一个个的传递实参值)

    fn.call(null,10,20,30);

    fn.apply(null,[10,20,30]); =>传递给fn的时候也是一个个的传递进去的

    bind 也是改变this的方法,它在IE6,7,8下不兼容,它和call(以及apply)改变this的原理不一样 fn.call(opp,10,20) =>把fn执行,让fn中的this变为opp,并且把10&&20分别传递给fn fn.bind(opp,10,20) =>预先让fn中的this指向opp,并且把10和20预先传递给fn,此时的fn没有被执行(只有当执行的时候this和实参才会起到应有的作用)

    需求:点击box这个盒子的时候,需要执行fn,并且让fn中的this指向opp

    oBox.onclick=fn; //=>点击的时候执行了fn,但是fn中的this是oBox

    oBox.onclick=fn.call(opp); //=>绑定事件的时候已经把fn立即执行了(call本身就是立即执行函数),然后把fn执行的返回值绑定给事件

    不忘初心,方得始终,初心易得,始终难守。
  • 相关阅读:
    使用JdbcTemplate访问数据库
    解决为什么每次打开Eclipse新的workspace需要更新nexus-maven-repository-index问题
    java内存设置
    Eclipse如何解决启动慢
    eclipse的包的加减号展开方式
    maven总结5
    maven总结4
    maven总结3
    maven总结2
    maven总结1
  • 原文地址:https://www.cnblogs.com/chuxinsyn/p/8559171.html
Copyright © 2011-2022 走看看