js中箭头函数this指向问题
都说箭头函数的this值是在函数定义时确定的,但我一直不清楚什么时候是定义的。
比如
这里打印的this是指向window的。但是定义的时候log不是定义在对象里面吗?
然后我看到箭头函数不创建自己的this值,而是继承最近的非箭头函数作用域的this。
我发现关键点在作用域上。
在JavaScript中,作用域主要由以下几种结构定义:
-
全局作用域:这是最外层的作用域,任何不在函数内部或者严格模式下不在块级作用域(例如if语句块)内的变量都被认为是全局变量,它们属于全局作用域。
-
函数作用域:每次调用函数时,都会创建一个新的作用域。函数内部定义的变量只能在该函数内部访问。
-
块级作用域:ES6引入了let和const关键字,允许在块级作用域(例如if、for、while等代码块)内声明变量。这些变量只在它们被声明的块级作用域内可见。
-
词法作用域:这是一种由函数定义的位置决定的作用域,无论函数在哪里被调用,它的词法作用域总是指向它被定义的地方。
-
模块作用域:在ES6模块中,每个模块都有自己的作用域,模块内部定义的变量和函数默认是私有的,不能被其他模块直接访问。
因此可以理解对象本身不创建新的作用域,但是对象内部可以定义函数,这些函数可以访问定义它们时的作用域链上的变量。例如,对象方法中的this关键字会指向调用该方法的对象,但这个this并不是由对象本身创建的作用域,而是由函数调用的上下文决定的。
可以看到对象obj1中的this是全局,对象本身没有作用域。
所有可以这么理解 箭头函数不创建自己的this值,而是继承上一级的 函数作用域 的this
可以看到箭头函数的this会是上一级函数obj.two的this
这里two任然是对象没有作用域,往上找,找到全局。