面试题答案
一键面试this
指向分析:- 在 JavaScript 中,普通函数的
this
指向取决于函数的调用方式。在非严格模式下,如果函数作为对象的方法调用,this
指向该对象;如果函数独立调用,this
指向全局对象(在浏览器中是window
,在 Node.js 中是global
)。在严格模式下,独立调用的函数this
指向undefined
。 - 对于箭头函数,它没有自己的
this
绑定。它的this
指向取决于外层作用域(词法作用域)中的this
。 - 在给定代码中:
outerFunction
和innerFunction
都是普通函数。当outerFunction
被调用时,由于它不是作为某个对象的方法调用(独立调用),在非严格模式下,this
指向全局对象(假设在浏览器环境下是window
)。innerFunction
同样是独立调用(在outerFunction
内部调用),在非严格模式下,this
也指向全局对象window
。arrowFunction
是箭头函数,它的this
指向外层作用域的this
,也就是window
(因为外层是普通函数innerFunction
,其this
指向window
)。
- 在 JavaScript 中,普通函数的
- 箭头函数对作用域链的影响:
- 箭头函数不创建自己的作用域,它的作用域基于外层词法作用域。在这个例子中,
arrowFunction
可以访问innerFunction
的作用域(可以访问b
)和outerFunction
的作用域(可以访问a
),因为它遵循词法作用域规则。它没有自己独立的作用域,所以不会干扰外层作用域链的正常查找。
- 箭头函数不创建自己的作用域,它的作用域基于外层词法作用域。在这个例子中,
- 箭头函数对函数提升机制的影响:
- 普通函数存在函数提升,即函数声明会被提升到所在作用域的顶部,可以在声明之前调用。而箭头函数不存在函数提升,因为它本质上是一个表达式,不是函数声明。在给定代码中,
innerFunction
是函数声明,在outerFunction
作用域内存在函数提升。而arrowFunction
是箭头函数表达式,不会被提升,它在定义的位置才会被解析和创建。
- 普通函数存在函数提升,即函数声明会被提升到所在作用域的顶部,可以在声明之前调用。而箭头函数不存在函数提升,因为它本质上是一个表达式,不是函数声明。在给定代码中,
- 输出结果及原因:
- 输出结果:在浏览器环境非严格模式下,会输出
window
(或者全局对象),1
,2
。 - 原因:
this
指向window
是因为箭头函数的this
继承自外层普通函数innerFunction
的this
,而innerFunction
的this
在非严格模式下独立调用指向window
。a
的值为1
是因为arrowFunction
可以访问外层outerFunction
作用域中的a
。b
的值为2
是因为arrowFunction
可以访问外层innerFunction
作用域中的b
。
- 输出结果:在浏览器环境非严格模式下,会输出