首先,我们来了解一下 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. linux定时任务(转)

    转自:https://www.cnblogs.com/intval/p/5763929.html linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非 ...

  2. 滚动加载|页面滑到底部加载数据|jquery.endless-scroll插件|使用demo

    <html> <head> <link rel="dns-prefetch" href="http://i.tq121.com.cn&quo ...

  3. MySQL InnoDB primary key根节点常驻内存

    mysql的InnoDB存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值的行记录时最多只需要1~3次磁盘I/O操作.

  4. BZOJ 4459: [Jsoi2013]丢番图 数学推导

    之前绝对做过几乎一模一样的题,现在做竟然忘了. code: #include <bits/stdc++.h> #define ll long long #define setIO(s) f ...

  5. Linux下g++编译thread出错的的解决方法

    错误如下图所示: 因为thread是C++11新加入的特性,所以我们在用g++编译的时候不能直接用,需要在g++后面加上 -std=c++0x -pthread 如果是gcc编译多线程的话则应该要用 ...

  6. LSF 作业系统常用命令

    LSF(Load Sharing Facility)是一个被广泛使用的作业管理系统,具有高吞吐.配置灵活的优点.通过 LSF 集中监控和调度,可以充分利用计算机的CPU.内存.磁盘等资源. bqueu ...

  7. cocos: 链接错误: _lz_adler32 in liblibquickmac.a

    错误: Undefined symbols for architecture x86_64: "_adler32", referenced from: _lz_adler32 in ...

  8. IntelliJ IDEA 统一设置编码为utf-8编码 /idea设置编码

    问题一. File->Settings->Editor->File Encodings 问题二. File->Other Settings->Default Settin ...

  9. 如何优雅地执行dubbo"单测"

    很多小伙伴所在的公司是基于Dubbo来构建技术栈的,日常开发中必不可少要写dubbo单测(单元测试),如果单测数据依赖已有的外部dubbo服务,一般是mock数据,如果数据比较复杂,其实mock数据也 ...

  10. thrift 是rpc协议

    PC(Remote Procedure Call,远程过程调用)是建立在Socket之上的,出于一种类比的愿望,在一台机器上运行的主程序,可以调用另一台机器上准备好的子程序,就像LPC(本地过程调用) ...