对于这两个原生JS的方法,一直有点绕不过来,朦朦胧胧的感觉。现在详细梳理一下:

  两者是基于继承的思想,

obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);

  两者作用一致,都是把obj(即this)绑定到thisObj,这时候thisObj具备了obj的属性和方法。或者说thisObj『继承』了obj的属性和方法。

  唯一区别是apply接受的是数组参数,call接受的是连续参数。

  当然,也可以把具体的属性或方法绑定到目标中。

如:blackCat.say.call(whiteDog)
原whiteDog并没有say方法,而blackCat有,所有通过call来将say方法绑定给whiteDog。
看到知乎上有位网友的一个比较好记的方法:

猫吃鱼,狗吃肉,奥特曼打小怪兽。

有天狗想吃鱼了

猫.吃鱼.call(狗,鱼)

狗就吃到鱼了

猫成精了,想打怪兽

奥特曼.打小怪兽.call(猫,小怪兽)

就这样记住了。

  关于this,引用一个比较容易理解的例子,https://www.cnblogs.com/zwyyouho-1/p/4974787.html

首先关于this我想说一句话,这句话记住了this的用法你也就差不多都能明白了:this指的是当前函数的对象。这句话可能比较绕,我会举出很多例子和这句话呼应的!(看下文)
1.首先看下面这段代码, 定义一个函数,弹下this,

Js代码  
  1. function doSomething(){
  2. alert(this);
  3. }
  4. doSomething();
我是在firefox里面调试的,所以返回的结果是[Object Window]。
那么这个 [Object Window], 到底是什么呢?看看下面的代码

Js代码  
  1. function doSomething(){
  2. alert(this===window);
  3. }
  4. doSomething();

看到弹出了true, 也就是说在这种正常情况下,this其实就是window
所以,我们定义了一个全局的变量的时候,可以
var test="Tony";
也可以
window["test"]="Tony";
下面这个例子,进一步说明,正常情况下,函数里的this就是window

Js代码  
  1. var test="Tony";
  2. function doSomething(){
  3. alert(this.test);     //弹出 "Tony";
  4. alert(window.test);   //弹出 "Tony";
  5. }
  6. doSomething();

第一次呼应:通过以上几个例子,我想可以说这几个例子中得this指的就是他当前函数doSomething()的Window对象。那顾名思义this.test自然就等于window.test了。事实也是如此。

2.我再举一个闭包的例子,但是在这里我不会解释什么是闭包,只是讲this的用法,明天我会学习闭包,今天就先当他是一个未知数,来学习this的一个工具。
     看这个例子:

Js代码  
  1. var name ="The Window";                     //创建了一个全局变量name
  2. var object = {                       //又创建了一个对象(创建对象的方法有很多种)
  3. name:"My Object",                //创建了一个name属性(属性就是引用非函数)
  4. doSomething:function(){          //创建了一个doSomething方法(方法就是引用了函数)
  5. return function(){       //这个doSomething方法返回一个匿名函数
  6. return this.name;    //这个匿名函数又返回this.name
  7. };
  8. }
  9. };
  10. alert(object.doSomething()());
  11. //由于这个doSomething方法返回的一个函数,所以这样就可以调用这个函数了

这段代码的主要解释我都注在了后面,主要想说的就是:这段代码返回的结果是"The Window",而不是我所预期的"My Object",前面不是说了吗? this指的是当前函数的对象, 可是在这里为什么就不是呢?其实就是因为闭包的特性,由于这个匿名函数构成了一个闭包,所以他所保存的就是整个变量对象也就是Window对象。这里先不说为什么,明天学闭包的时候我还会用这个例子的,这里就先接受下来。
     那么如何做才能让结果返回"My Object"呢?还是那句话this指的是当前函数的对象,那么问题就简单了,也就是让this放在doSomething方法里,而不是那个匿名函数里不就可以了吗?修改代码如下:

Js代码  
  1. var name ="The Window";
  2. var object = {
  3. name:"My Object",
  4. doSomething:function(){
  5. var abc = this ;
  6. return function(){
  7. return abc.name;
  8. };
  9. }
  10. };
  11. alert(object.doSomething()());

第二次呼应:现在再看代码红色部分做的修改,this是不是指的是当前doSomething()函数的object对象了?那再输出结果自然就是"My Object"了。
      通过这两次呼应,是不是感觉已经对this有了一定的了解呢,其实this用到的地方还很多,以后还会慢慢讲到,比如在jQuery中this依然指的是当前函数的对象。

  关于闭包,下次再学,今天看了太多代码了,脑子有点糊了。https://www.cnblogs.com/yunfeifei/p/4019504.html

转载于:https://www.cnblogs.com/ljwsyt/p/9057093.html

call和apply;this;闭包相关推荐

  1. Swift 烧脑体操(五)- Monad

    前言 \\ Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说 ...

  2. [原]Java程序员的JavaScript学习笔记(7——jQuery基本机制)

    计划按如下顺序完成这篇笔记: 理念. 属性复制和继承. this/call/apply. 闭包/getter/setter. prototype. 面向对象模拟. jQuery基本机制. jQuery ...

  3. jQuery AJAX回调函数this指向问题

    了解JavaScript的人都知道JavaScript的this不总是指向当前对象,函数或类中的this指向与调用这个函数的对象以及上下文环境是息息相关的.如在全局作用域调用一个含this的对象,此时 ...

  4. Scala与Java语言的差异

    1.源文件后缀名 Java:.java Scala:.scala 2.变量 Java: int param1 = 100; int param2 Scala: 格式: var VariableName ...

  5. 牛客网—web前端练习

    2018-12.1第一次练习 1.下列哪个样式定义后,内联(非块状)元素可以定义宽度和高度:display:block display属性 : block : CSS1 块对象的默认值.将对象强制作为 ...

  6. 自己整理的前端开发面试题

    前端开发面试题 文章目录 前端开发面试题 JavaScript面试题 1-JavaScript数据类型 基本类型 引用类型 null和undefined的区别 ES10新增BIgInt表示任意大的整数 ...

  7. 前端战五渣学JavaScript——防抖、节流和rAF

    看了<JavaScript高级程序设计>和网上的一些博客,感觉对函数节流和函数防抖的概念是反的,以下我写的关于防抖和节流的概念取决于多数人的概念吧,并且基于伦敦前端工程师David Cor ...

  8. 【Android Gradle 插件】Module 目录下 build.gradle 配置文件 ( plugins 闭包代码块中引入插件 | PluginAware#apply 方法引入插件 )

    文章目录 一.Module 目录下 build.gradle 配置文件 1.plugins 闭包代码块中引入插件 2.PluginAware#apply 方法引入插件 Android Plugin D ...

  9. 静态属性,函数闭包,call/apply,继承

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. javascript中实例对象和构造函数关系、原型语法、原型链、call实现继承、apply调用函数、bind拷贝函数、拷贝继承、class类、super、严格模式、高阶函数、闭包、递归、es6简介

    实例对象和构造函数的关系及原型: 实例对象是通过构造函数创建出来的,实例对象的构造器constructor就是指向构造函数的:每个实例对象中的同一方法的指向是各不相同的,但是其属性值相同的属性可以相同 ...

最新文章

  1. python os open_Python3 os.open() 方法
  2. Exchange2007 中Send as 与Send on behalf of 讲解
  3. Linux安装python3.6 和pip
  4. C语言与sqlserver数据库
  5. mysql 8.1初始密码_MySQL8.0安装之后查找默认密码
  6. 1 TB /节点时快速,可预测且高度可用
  7. 【第十六章】模板实参推断
  8. 遇到Visual Studio 当前不会命中断点.还没有为该文档加载任何符号的情况
  9. iphone开发如何隐藏各种bar
  10. 熔断器熔断时间标准_一种熔断器熔断时间测试电路的制作方法
  11. haneWin NFS服务器配置
  12. 当兵心理测试软件,当兵心理测试题及答案
  13. HDOJ 4889 Scary Path Finding Algorithm 颠覆spfa slf优化
  14. LaTex 在图片上添加文字和公式
  15. 《棒球殿堂》:棒球联盟LEAGUE·东北乐天金鹫
  16. 云服务器修改安全组规则要重启吗,华为云修改安全组需要重启吗
  17. C#winform TreeView编程
  18. 驱动调试-摄像头部分
  19. 重学Android基础系列篇(五):Android虚拟机指令
  20. 老男孩之猛龙过江电影高清版迅雷下载

热门文章

  1. TIOBE 11 月榜单:C、Swift、Go、D 与 Rust 起起伏伏
  2. mysql 排序速度_MySQL排序速度慢而且可能不稳定
  3. android重复拉起app首页_Android进程管理:Framework层概念
  4. 深度神经网络训练过程中为什么验证集上波动很大_图神经网络的新基准
  5. 查看java运行时参数_查看JVM运行时参数
  6. wifi频率和zigbee干扰_浅谈ZigBee和Wi—Fi的共存和干扰
  7. junit依赖_3、Spring 中的依赖注入(DI),你都知道多少?
  8. wx:for双层循环
  9. 计算机网络的一大发展趋势是多维化,对口高考计算机网络概述复习.ppt
  10. ionic应用在mac上使用Xcode7.2(7C68)进行iphone真机测试