以前读语言精粹的时候一直对函数的调用的理解是模模糊糊,只知其一;不知其二。尤为是 函数调用模式
更是一头雾水。终于今天让我遇到这个问题了,总算是对函数调用模式
和this
有了一个相对来讲比较清楚的认识。java
javascrit中的this有一个特性就是:运行期绑定(不包括箭头函数),因此this能够是 全局对象
,当前对象
或者 任意对象
,这彻底取决于函数的调用方式函数
以此模式调用函数时, this
会被绑定到全局对象。这是一个语言上的设计错误。举个栗子:this
var Chat = { func1 () { //... this.func2() //这里会报错: func2 is not a function } func2 () { //... } }
出现这种错误的缘由就是,this
没有绑定到Chat对象上,而是绑定到全局对象上了。致使,方法不能利用内部函数。设计
解决方法一:code
var Chat = { func1 () { //定义一个变量that赋值给this,那么内部函数能够经过that访问到this var that = this this.func2() } func2 () { //... } }
解决方法二:对象
var Chat = { func1 (){ Chat.func2() //谁的方法,谁调用 } func2 () { //... } }
function taskA() { this.name = 'hello' var fn = function() { console.log(this) console.log(this.name) } var arrow_fn = () => { console.log(this) console.log(this.name) } fn() arrow_fn() } taskA()
首先根据 词法做用域
,因为它自己没有this,因而便向上查找this
。接下来,发现taskA是有this的,因而便直接继承了taskA的做用域。继承
那么,问题来了:taskA的this又是什么呢?
taskA是一个普通函数,普通函数的this是在运行时决定的,因为咱们是直接调用taskA的,即taskA(),因此其this即是window。因此,在这个例子中,arrow_fn中的this是window作用域
因此,综上所述:箭头函数中的this是定义的时候就决定的。另外,还须要注意的一点是:它的 this 指向是不可改变的it