博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
call() , apply() , bind() 方法,
阅读量:4560 次
发布时间:2019-06-08

本文共 1540 字,大约阅读时间需要 5 分钟。

  先来说说call() 和 apply()方法:

  在《javascript高级程序设计》中有提到:函数也是对象,函数原型链的顶层实际上是指向Object的。既然函数是对象,那么自然就具有属性和方法。“ 每个函数都包含两个非继承而来的方法  call() , apply() ”

  call() , apply() , 这两个方法其本质就是设置函数体内this对象指向的值,换个说法来理解这句话,一个对象可以通过call() 和 apply() 来调用其他对象的方法。比如说对象A拥有一个 sayName的方法,但是对象B没有这个方法,正常来说,我们就不能在对象B调用sayName方法,如果我们又不想为对象B定义一个sayName方法,这是就可以使用call() , apply() 

对象不需要和方法有任何的耦合关系!

function Person() {};Person.prototype = {   name: 'Jersey',   sayName:function() {        console.log(this.name);    }    } var person1 = new Person();person.sayName();  //           Jerseyvar car = {   name: 'Car';  }car.sayName();     //  wrong!person1.sayName.call(car);    //Carperson1.sayName.apply(car);    //Car //这时函数sayName里的this指向carwindow.color = 'red';var o ={color: 'biue'}function say() {   console.log(this.color);    //  red  全局环境中this指向window      }say.call(this);    //red   设置say函数内的this指向这个thissay.call(window);    //red     设置say函数内的this指向windowsay.call(o);    //biue   设置say函数内的this指向对象o , 这是say函数的执行环境就改变了

call() 和 apply() 方法的作用相同,他们区别仅在于接收参数的方式不同。(这里就不多说了)

bind() 方法:

  使用bind()方法会创建一个函数的实例(因为函数是对象嘛),这个函数实例的this值会被绑定到传入bind()方法的第一个参数上

window.color = 'red';var o = {color: 'blue'};function say() {    console.log(this.color);    //red}var sayColor = say.bind(o);    //首先创建了一个函数的实例,把原say函数的this值绑定到对象o上,在把这个函数实例保存到变量sayColor里sayColor();    //blue

使用call() 和 apply()方法会立即执行调用这两个方法的函数,使用bind()方法,会创建一个函数实例,在调用这个函数实例的时候才执行

其实要理解这三个方法最重要的就是理解函数对象,就把函数想象成普通的对象,然后call()  apply()  bind()  作为这个对象的方法去改变这个函数内部的一些东西

转载于:https://www.cnblogs.com/lugefan/p/7270367.html

你可能感兴趣的文章
[CSS3] The picture element
查看>>
[RxJS] exhaustMap vs switchMap vs concatMap
查看>>
[Angular & Web] Retrieve user data from Session
查看>>
[Regular Expressions] Find Groups of Characters, and ?:
查看>>
研读代码必须掌握的Eclipse快捷键
查看>>
面试题
查看>>
UVA 10341 solve it
查看>>
ESFramework 4.0 概述[转]
查看>>
【原】Sql2005 实现递归
查看>>
HTMLparser 笔记
查看>>
[bzoj2243][SDOI2011]染色
查看>>
mysql 数据库、表、视图 的创建/修改/删除
查看>>
c#实现远程操作svn
查看>>
(转)找增强方法总结
查看>>
sql数据库笔记
查看>>
三种数据解析方式
查看>>
Rpgmakermv(32) Yep_mainmenumanager
查看>>
poj 1273 第1道网络流 Edmonds-Karp算法
查看>>
Python之tuplet的认识
查看>>
JS刷新父窗口的几种方式<转>
查看>>