# 前期准备
在正式阅读之前,你需要知道this的5种绑定方式:
- 默认绑定(非严格模式下this指向全局对象, 严格模式下
this会绑定到undefined) - 隐式绑定(当函数引用有上下文对象时, 如
obj.foo()的调用方式,foo内的this指向obj) - 显示绑定(通过
call()或者apply()方法直接指定this的绑定对象, 如foo.call(obj)) - new绑定
- 箭头函数绑定(
this的指向由外层作用域决定的)
# 1. 默认绑定
先介绍一种最简单的绑定方式吧:默认绑定。
也就是我们常说的:在非严格模式下this指向的是全局对象window,而在严格模式下会绑定到undefined。
# 1.1 题目一
老规矩,来看个最基本的案例:
var a = 10;
function foo () {
console.log(this.a)
}
foo();
@前端进阶之旅: 代码已经复制到剪贴板
我们知道在使用var创建变量的时候(不在函数里),会把创建的变量绑定到window上,所以此时a是window下的属性。
而函数foo也是window下的属性。
因此上面的代码其实就相当于是这样:
window.a = 10;
function foo() {
console.log(this.a)
}
window.foo();
@前端进阶之旅: 代码已经复制到剪贴板
在这里,调用foo()函数的是window对象,且又是在非严格模式下,所以foo()中this的指向是window对象,因此this.a会输出10。
答案:
10
@前端进阶之旅: 代码已经复制到剪贴板
# 1.2 题目二
改造下题目一,看看在严格模式下。
(想要开启严格模式,只要在需要开启的地方写上"use strict")
"use strict";
var a = 10;
function foo () {
console.log('this1', this)
console.log(win