面试中遇到的题目,当场把我问得有点蒙,对严格模式,this的理解还不够深入。
function foo(){
console.log(this.a);
}
var a = 2;
foo() //2
严格模式:函数调用时,是直接使用不带任何修饰的函数引用进行调用,因此只能使用默认绑定,无法应用其他规则。但是在严格模式下不能将全局对象用于默认绑定所以this会绑定到undefined。(非严格模式,默认绑定绑定全局对象; 严格模式,默认绑定绑定到undefined上。)
严格模式下:
“考虑到 this 是词法层面上的,严格模式中与 this 相关的规则都将被忽略。(可以忽略是否在严格模式下的影响)”
这句话的意思应该是指在箭头函数中,严格模式的规则会被忽略。
"箭头函数没有this"
箭头函数下非严格模式:
箭头函数下严格模式:
再看一个例子
var str = 'window';
const obj = {
str:'obj',
fn: ()=>{
console.log(this.str);
},
fn2: ()=>{
console.log(this.str, '当前词法作用域中的this')
return {
str: 'newObj',
fn: ()=>{
console.log(this.str);
}
}
}
}
obj.newFn = ()=>{
console.log(this.str);
}
obj.fn();
obj.newFn();
var newObj = obj.fn2();
newObj.fn();
输出:
window debugger eval code:6:10
window debugger eval code:20:13
window 当前词法作用域中的this debugger eval code:9:10
window
第二种
var str = 'window';
const obj = {
str:'obj',
fn: ()=>{
console.log(this.str);
},
fn2: function(){
console.log(this.str, '当前词法作用域中的this')
return {
str: 'newObj',
fn: ()=>{
console.log(this.str);
}
}
}
}
obj.newFn = ()=>{
console.log(this.str);
}
obj.fn();
obj.newFn();
var newObj = obj.fn2();
newObj.fn();
输出:
VM229:6 window
VM229:20 window
VM229:9 obj 当前词法作用域中的this
VM229:13 obj