一道经典的 js 面试题

原题目
  • 在浏览器环境下,判断程序输出的结果是?
    var foo = 'window的foo'
    let obj = {
        foo: 'obj的foo',
        func() {
            let self = this
            console.log(this.foo)
            console.log(self.foo)
            ;(function () {
                console.log(this.foo)
                console.log(self.foo)
            })()
        }
    }

    obj.func()
    console.log(window.foo)
  • 结果
    在这里插入图片描述
  • 解释
    • 第一个输出,this在成员函数内部,所以指向obj,输出obj的foo
    • 第二个输出,self和该位置的this指向相同,所以也指向obj,输出obj的foo
    • 第三个输出,由于这个this在匿名函数内部,所以指向windowvar会将变量挂载到window上,自然就会输出window的foo
    • 第四个输出,self的指向一直都是obj,没有发生改变,故输出obj的foo
变题1
  • obj内部的函数func改成以箭头函数方式赋值
    var foo = 'window的foo'
    let obj = {
        foo: 'obj的foo',
        func: () => {
            let self = this
            console.log(this.foo)
            console.log(self.foo)
            ;(function () {
                console.log(this.foo)
                console.log(self.foo)
            })()
        }
    }

    obj.func()
    console.log(window.foo)
  • 结果
    在这里插入图片描述
  • 解释
    • 改成箭头函数之后,functhis的指向与obj所处环境上下文的this指向一致,即指向window,其他的与第一个例子同理
变题2
  • func函数内部的匿名函数改成箭头函数形式
 var foo = 'window的foo'
    let obj = {
        foo: 'obj的foo',
        func() {
            let self = this
            console.log(this.foo)
            console.log(self.foo)
            ;(() => {
                console.log(this.foo)
                console.log(self.foo)
            })()
        }
    }

    obj.func()
    console.log(window.foo)
  • 结果
    在这里插入图片描述
  • 解释
    • 匿名函数中的this指向和匿名函数所在环境上下文的this指向一致,即指向obj
变题3
  • 二者均改成箭头函数形式,且将最外层的 foo的声明方式从var改成let
    let = 'window的foo'
    let obj = {
        foo: 'obj的foo',
        func: () => {
            let self = this
            console.log(this.foo)
            console.log(self.foo)
            ;(() => {
                console.log(this.foo)
                console.log(self.foo)
            })()
        }
    }

    obj.func()
    console.log(window.foo)
  • 结果
    在这里插入图片描述
  • 均改成箭头函数形式后,不论哪里的this都指向了window;改成let之后,不会将变量挂载到window对象上,故所有都是undefined
结语

如果对你有帮助的话,请点一个赞吧

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值