var param = 'window';

var obj1 = {
  param: 'obj1',
  fn1: function () {
    console.log(this.param);
  },
  fn2: () => console.log(this.param),
  fn3: function () {
    return function () {
      console.log(this.param);
    }
  },
  fn4: function () {
    return () => console.log(this.param);
  }
}
var obj2 = { param: 'obj2' };
obj1.fn1(); // obj1 默认绑定
obj1.fn1.call(obj2); // obj2 显式绑定

obj1.fn2(); // window 没有外层函数
obj1.fn2.call(obj2); // window 没有外层函数,箭头函数不能显式绑定

obj1.fn3()(); // window 隐式丢失
obj1.fn3().call(obj2); // obj2 显式绑定
obj1.fn3.call(obj2)(); // window 隐式丢失

obj1.fn4()(); // obj1 外层函数this为obj1
obj1.fn4().call(obj2); // obj1 外层函数this为obj1,箭头函数不能显式绑定
obj1.fn4.call(obj2)(); // obj2 外层函数显式绑定obj2

箭头函数的this指向外层函数作用域中的this;
箭头函数的this无法通过bind,call,apply来直接修改;
改变外层函数作用域中的this即可改变箭头函数的this。

var param = 'window';

function Obj(param) {
  this.param = param;
  this.fn1 = function () {
    console.log(this.param);
  }
  this.fn2 = () => console.log(this.param);
  this.fn3 = function () {
    return function () {
      console.log(this.param);
    }
  }
  this.fn4 = function () {
    return () => console.log(this.param);
  }
}

var obj1 = new Obj('obj1');
var obj2 = new Obj('obj2');

obj1.fn1(); // obj1
obj1.fn1.call(obj2); // obj2

obj1.fn2(); // obj1
obj1.fn2.call(obj2); // obj1

obj1.fn3()(); // window
obj1.fn3().call(obj2); // obj2
obj1.fn3.call(obj2)(); // window

obj1.fn4()(); // obj1
obj1.fn4().call(obj2); // obj1
obj1.fn4.call(obj2)(); // obj2

构造函数创建对象与直接用字面量的形式去创建对象是不同的,区别在于它多了构造函数的作用域。

运行程序,解读this指向---case4的更多相关文章

  1. 操作系统篇-hello world(免系统运行程序)

     || 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言     今天起开始分享关于操作系统的相关知识,本人也是菜鸟一个,正处于学习阶段,这整个操作系统篇也是我边学习边总结的一些结果,希 ...

  2. windows服务编写和“以管理员运行”程序的方法

    本文将首先解释如何 创建 一个定期查询可用物理内存并将结果写入某个文本文件的服务.然后指导你完成生成,安装和实现服务的整个过程. 第一步:主函数和全局定义 首先,包含所需的头文件.例子要调用 Win3 ...

  3. python介绍,计算机核心基础,与运行程序有关的三大核心硬件,操作系统

    python介绍,计算机核心基础,与运行程序有关的三大核心硬件,操作系统 引子 python是什么? 什么是编程语言?为何要有编程语言? 什么是编程?什么是程序?什么是进程?为何要编程? 计算机基础 ...

  4. CYPEESS USB3.0程序解读之---GPIO

    CPRESS 官方给出的SDK1.1中(目前最新的SDK),提供了大量的例程供我们开发软件的时候作参考,就像STM32的开发一样提供了库一样,但是又不是库,仅仅是参考例程. 首先看一个简单一点的GPI ...

  5. Xcode 运行程序,左侧memory 不显示内存

    运行程序后,xcode 不显示当前使用的内存情况,问题是打开了僵尸--enable zoombie Objects,关闭即可 打开 product--->SCheme-->EditSChe ...

  6. C# 管理员身份运行程序

    在使用winform程序获取调用cmd命令提示符时,如果是win7以上的操作系统,会需要必须以管理员身份运行才会执行成功,否则无效果或提示错误. 比如在通过winform程序执行cmd命令时,某些情况 ...

  7. IntelliJ IDEA 配置运行程序

    IntelliJ IDEA 对于Javaer开发来说还是很nice的,就是第一次用可能配置项有点生疏,这里就记录一下IntelliJ IDEA 配置运行程序. 1. 点击Edit Config... ...

  8. Usage: AddDimensionedImage imageFile outputFile eclipse 运行程序出错

    关于这个在eclipse中运行java程序的错,首先确认你的jdk,jre是否完整,并且与你的eclipse的位数相同,当然我相信这个错误大家应该都会去检查到. 第二个关于addDimensioned ...

  9. [原创]Win7、Win8、Win10始终以管理员身份运行程序。

    在Win7.Win8.Win10系统中,以管理员身份运行程序很麻烦,一般有以下几种方式: 1.在可执行程序或快捷方式上右键,以管理员身份运行: 2.在可执行程序或快捷方式上右键->属性-> ...

随机推荐

  1. vue+webpack开发(三)

    上一篇博文讲了怎么使用路由,这次主要讲讲怎么编写一个vue组件 vue定义了一种“单文件组件”后缀为‘.vue’的文件,大概长这样子: <template> <div> < ...

  2. [转载]为什么有些MP4文件在Chrome浏览器上播放不了?

    http://blog.sina.com.cn/s/blog_6bb7ebcc0101c2ja.html Chrome浏览器支持HTML5,它支持原生播放部分的MP4格式(不用通过Flash等插件). ...

  3. javascript私有方法揭示为公有方法

    揭示模式可用于将私有方法暴露为公共方法.当为了对象的运转而将所有功能放置在一个对象中以及想尽可能地保护该对象,这种揭示模式就非常有用. 板栗: var myarray; (function(){ va ...

  4. [Alg::DP] Square Subsequence

    题目如下: #include <iostream> #include <string> #include <vector> using namespace std; ...

  5. 【干货】查看windows文件系统中的数据—利用簇号查看文件与恢复文件

    前面我们使用这个软件发现了很多删除掉的数据,今天来看看簇.FAT文件系统中,存在一个簇的链接,我知道了簇1在哪里就可以顺藤摸瓜恢复所有的信息. 这里使用FAT 12为例子,FAT其他万变不离其宗,甚至 ...

  6. TensorBoard 简介及使用流程【转】

    转自:https://blog.csdn.net/gsww404/article/details/78605784 仅供学习参考,转载地址:http://blog.csdn.net/mzpmzk/ar ...

  7. 管中窥豹:从Page Performance看Nand Flash可靠性【转】

    转自:https://blog.csdn.net/renice_ssd/article/details/53332746 如果所有的page performace在每次program时都是基本相同的, ...

  8. mysql双主+keepalived【转】

    简单原理 1.在两台服务器上分别部署双主keepalived,主keepalived会在当前服务器配置虚拟IP用于mysql对外提供服务 2.在两台服务器上分别部署主主mysql,用于故障切换 3.当 ...

  9. oracle数据库查询重复记录

    1.row_number()方法 1 2 3 4 5 6 7 8 9 10 11 SELECT     row_number () over (         PARTITION BY v.acti ...

  10. docker 要点学习

    本文主要记录学习和使用docker时遇到的一些问题和踩过的坑 1.本地docker新建redis容器,映射6379端口到本地,本机的java项目再去连,会一直连不上,原因是redis容器中映射端口时需 ...