面试题答案
一键面试-
分析
inner
函数中this
的指向及原因:- 在非严格模式下,
inner
函数中this
指向全局对象(在浏览器环境中是window
,在Node.js环境中是global
)。原因是当函数作为普通函数调用时(即没有通过某个对象来调用,像obj.func()
这种形式),非严格模式下this
默认指向全局对象。这里inner()
是直接调用,没有所属对象,所以this
指向全局对象。 - 在严格模式下,
inner
函数中this
指向undefined
。因为严格模式下,普通函数调用时this
不会默认指向全局对象,而是undefined
。
- 在非严格模式下,
-
让
inner
函数中的this
指向outer
函数的实例对象的修改方法:- 方法一:使用
bind
方法:
- 方法一:使用
function outer() {
var a = 1;
function middle() {
var b = 2;
function inner() {
console.log(this);
}
var boundInner = inner.bind(this);
boundInner();
}
middle();
}
outer();
- 方法二:使用
call
或apply
方法:
function outer() {
var a = 1;
function middle() {
var b = 2;
function inner() {
console.log(this);
}
inner.call(this);
// 或者 inner.apply(this);
}
middle();
}
outer();
- 方法三:使用箭头函数:
function outer() {
var a = 1;
function middle() {
var b = 2;
const inner = () => {
console.log(this);
};
inner();
}
middle();
}
outer();
- 在上述方法中,
bind
方法创建一个新函数,将inner
函数的this
绑定到middle
函数的this
(而middle
函数的this
在outer
函数调用时指向outer
函数的实例对象)。call
和apply
方法是在调用inner
函数时,将this
指定为middle
函数的this
。箭头函数没有自己的this
,它的this
继承自外层作用域,这里外层是middle
函数,而middle
函数的this
在outer
函数调用时指向outer
函数的实例对象。