首先,我们来了解一下 this 的几种绑定方式:

  this的默认绑定:

 当一个函数没有明确的调用对象的时候,即作为独立函数调用时,this绑定到全局window对象。

function  func() {
console.log(this);
} func() //window

  this的隐式绑定:

 当函数被其他对象包含再其中时,这时this被隐式绑定到了这个对象中;因此,通过this可以直接访问到该对象中的其他属性。

var foo = {name:'Lily'}
var obj = {
name: 'John',
age: 20,
sayName: function(){
console.log(this === obj);
console.log(this.name);
}
}
obj.sayName(); //true John
foo.sayName = obj.sayName;
foo.sayName(); //false Lily

  this的显式绑定:

 调用call() 或 apply()方法来实现this的主动绑定

var animals = [
{species: 'Lion', name: 'King'},
{species: 'Whale', name: 'Fail'}
]; for (var i = 0; i < animals.length; i++) {
(function (i) {
this.print = function () {
console.log('#' + i + ' ' + this.species + ': ' + this.name);
}
this.print();
}).call(animals[i], i);
}
//#0 Lion: King
//#1 Whale: Fail

  this的new绑定:

 函数被执行new操作后,将创建一个新的对象,并将构造函数的this指向所创建的构造函数。

function foo(name){
this.name = name
} var bar = new foo('John');
console.log(bar.name); //John

  this的硬绑定

 当this被强制绑定后,无论之后任何调用该this都不变

var a = 5;
function foo(){
console.log(this.a);
}
var obj = {
a: 2
}
var bar = function(){
foo.call(obj);
}
bar(); //
bar.call(window);//

  

说完上述几种this绑定的情况后,就要来说一下箭头函数中的this了:

  

function foo() {
return () => {
return () => {
console.log(this)
}
}
}
console.log(foo()()()) //window

  箭头函数中实际上并没有this箭头函数中的this只取决包裹箭头函数的第一个普通函数的this。在这个例子中,因为包裹箭头函数的第一个普通函数是foo,所以此时的this是window。

  

随机推荐

  1. 安装Matlab出现弹出DVD1插入DVD2的提示怎么办?

    此使,找到DVD1光驱,右键弹出,然后回到dvd2.iso文件右键装载,回到matlab安装页面,对提示框“弹出DVD1插入DVD2”点击确定,安装即可继续进行.

  2. 重构之字段改名 UML行为图 用例图 时序图&协作图 状态图&活动图 依恋情结

    简单的使用一下字段改名 为什么使用字段改名: ​ 你在一个软件上做的工作越多,对这个软件的数据的理解就越深刻,你需要把这些理解融入到代码中.利用名字的解释作用,让代码更容易被理解. 如何找到该变量的所 ...

  3. js spread object

    What’s is the benefit / drawback of these two alternatives? Using object spread options = {...option ...

  4. 关于System.TypeInitializationException异常

    什么是System.TypeInitializationException 作为类初始值设定项引发的异常的包装器而引发的异常. 继承 Object Exception SystemException ...

  5. Python I/O编程 --读写文件、StringIO/ BytesIO

    I/O编程 Input/Output  输入/输出 Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水 Input Stream就是数据从外面(磁盘.网络)流进内存,Ou ...

  6. Linux软件安装——软件包分类、RPM包管理

    1.软件包分类: (1)源码包: 优点:开源,即用户可以看到源代码,用户可以修改源代码:可以自由选择所需的功能:软件是编译安装,效率更高. 缺点:需要手动安装,安装慢. (2)二进制包(RPM包.系统 ...

  7. json-server模拟服务器API

    一.npm安装 npm install --global json-server 二.使用:创建一个json数据文件,比如: { "students": [{ "id&q ...

  8. Macbook Pro 键盘触摸板失灵,只有电源键有反应 修复手札

    上次说到换完电池后键盘和触摸板就没反应了,只好硬着头皮把所有的元件一个个拆下来试. 经过3天的测试(试了网上所有能找到的办法,最多的就是重置smc和nvmp),最终确定故障应该在触摸板排线上. 没有废 ...

  9. KVM系统镜像制作

    使用virt-install创建虚拟机并安装GuestOS virt-install是一个命令行工具,它能够为KVM.Xen或其它支持libvirt API的hypervisor创建虚拟机并完成Gue ...

  10. Eclipse解决项目中找不到Maven Dependencies

    项目中找不到Maven Dependencies 正常的Maven项目应该是这样的 自己的项目中却没有Maven Dependencies 先做第一步 若项目中还没有出现Maven Dependenc ...