首先,我们来了解一下 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. appium环境应该注意问题

    python中的script要加入到环境变量中 pip3 install appium-python-client(安装appium模块通过引入webdriver) 如果pip3不是内部命令解决方法 ...

  2. 在Maven项目中,jsp不解析el表达式

    我的这个项目是用Maven-archetype-webapp项目创建的,如下图所示: 有这种方式创建有一个坑,就是它使用的servlet版本是2.3,而servlet2.4以下的版本是不会自动解析el ...

  3. python3.7 win10配置opencv和扩展库

  4. 在没有符号和FPO的情况下遍历堆栈(帧指针省略)

    下面是应用程序崩溃转储的调用堆栈.报告的崩溃是名为“HelperLibrary”的模块内的访问冲突,我们没有该模块的符号或源代码.调用堆栈看起来不太可能: 0:000> kv ChildEBP ...

  5. RookeyFrame 一些心得 或者 调试技巧等

    因为没有依赖具体的实现层,类库的输出路径又没有设置在web层的bin目录,所以每次都要拷贝实现层的DLL过去,有时候拷贝过去了还是没有反应,估计是缓存什么的吧, 解决:先那几个web层bin目录的 D ...

  6. 3-开发共享版APP(搭建指南)-修改手机验证码

    https://www.cnblogs.com/yangfengwu/p/11273743.html 请先看数据篇 或者参考 https://www.cnblogs.com/yangfengwu/p/ ...

  7. 【题解】 洛谷 P2649 游戏预言

    题目: P2649 游戏预言 题意: John和他的好朋基友们在van纸牌游戏.共有\(m\)个人.纸牌有\(n \times m\)张,从\(1--n \times m\)编号.每人有\(n\)张. ...

  8. 【AtCoder】 ARC 098

    link C-Attention 题意:一个字符队列,每个位置是\(W\)或\(E\),计算最小的修改数量,使得存在一个位置,它之前的都是\(E\),之后的都是\(F\) #include<bi ...

  9. Spring 注解@Value详解

    一.spring(基础10) 注解@Value详解[1] 一 配置方式 @value需要参数,这里参数可以是两种形式: [html] view plain copy @Value("#{co ...

  10. FileInputFormat 的实现之TextInputFormat

    说明 TextInputFormat默认是按行切分记录record,本篇在于理解,对于同一条记录record,如果被切分在不同的split时是怎么处理的.首先getSplits是在逻辑上划分,并没有物 ...