都是天生自带的内置方法(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执行的返回值绑定给事件

call apply bind的区别的更多相关文章

  1. call apply bind 的区别

    1.call和apply都是对函数的直接调用,而bind方法返回的仍然是一个函数,因此后面还需要()来进行调用才可以 var xw={ name: "小王", gender: &q ...

  2. js 中call,apply,bind的区别

    call.apply.bind方法的共同点与区别: apply.call.bind 三者都是用来改变函数的this对象的指向: apply.call.bind 三者都可以利用后续参数传参: bind ...

  3. call、apply/bind的区别和用法(简单粗暴的解释)

    var obj1={ name:"bob", age:20 } var obj2={ name:"coco", age:22 } function getAge ...

  4. JS中call,apply,bind的区别

    1.关于this对象的指向,请看如下代码 var name = 'jack'; var age = 18; var obj = { name:'mary', objAge:this.age, myFu ...

  5. 浅谈call apply bind的区别

    这三个方法的用法非常相似,将函数绑定到上下文中,即用来改变函数中this的指向.举个例子: var zlw = { name: "zlw", sayHello: function ...

  6. javascript中的call(),apply(),bind()方法的区别

    之前一直迷惑,记不住call(),apply(),bind()的区别.不知道如何使用,一直处于懵懂的状态.直到有一天面试被问到了这三个方法的区别,所以觉得很有必要总结一下. 如果有不全面的地方,后续再 ...

  7. 有关call和apply、bind的区别及this指向问题

    call和apply都是解决this指向问题的方法,唯一的区别是apply传入的参数除了其指定的this对象之外的参数是一个数组,数组中的值会作为参数按照顺序传入到this指定的对象中. bind是解 ...

  8. this指向与call,apply,bind

    this指向与call,apply,bind ❝ 「this」问题对于每个前端同学来说相信都不陌生,在平时开发中也经常能碰到,有时候因为「this」还踩过不少坑,并且「this」问题在面试题中出现的概 ...

  9. javascript中apply、call和bind的区别

    在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢.在说区别之前还是先总结一下三者的相似之处:1.都是用来改变函数的this对象的指向的.2.第一个参数都是this要指向的对 ...

随机推荐

  1. Java RSA 公钥加密私钥解密

    package com.lee.utils; import java.io.DataInputStream; import java.io.File; import java.io.FileInput ...

  2. How to Make a Computer Operating System

    How to Make a Computer Operating System 如何制作一个操作系统(翻译版) 原文地址:Github:How to Make a Computer Operating ...

  3. node全局安装说明(create-react-app、)

    1.使用 create-react-app 快速构建 React 开发环境 国内使用 npm 速度很慢,你可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm: $ np ...

  4. harbor pull 失败

    STep1: 显示下面的错误 Error response from daemon: unknown: The image is not signed in Notary Step2: 这儿暂时不要选 ...

  5. flutter Dynamic updates 热更新 版本更新

    比较新的解释 https://juejin.im/entry/5c85c959f265da2d881b5eb8 https://my.oschina.net/u/1464083/blog/297880 ...

  6. JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法

    网上搜索了,目前主流的Js代码压缩工具主要有Uglify.YUI Compressor.Google Closure Compiler,简单试用了UglifyJS 和Google Closure Co ...

  7. HDU 1560 DNA sequence(DNA序列)

    HDU 1560 DNA sequence(DNA序列) Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K  ...

  8. Linux mint 下开发设置

    切换thinpad Home-Pgup End-Pgdn sudo vim ~/.Xmodmap keysym Prior = Home keysym Next = End 禁用鼠标中间粘帖功能 su ...

  9. [原][译]我们为什么需要另一个c++测试框架?Catch||Why do we need yet another C++ test framework?

    翻译问题来源:https://github.com/catchorg/Catch2/blob/master/docs/why-catch.md 其他辅助博文:从Google Test 转到 Catch ...

  10. 在单机Docker上安装 Traefik 反向代理-负载均衡器

    一.创建Traefik和容器应用的连接网络 sudo docker network create traefik-net 二.下载Traefik样本配置文件wget https://raw.githu ...