关于this

面试中遇到的题目,当场把我问得有点蒙,对严格模式,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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值