首页 > 试题广场 >

以下代码执行的结果是: function fun&

[单选题]
以下代码执行的结果是:
function fun () {
    return () => {
        return () => {
            return () => {
            console.log(this.name)
                    }
                }
        }
}
var f = fun.call({name: 'foo'})
var t1 = f.call({name: 'bar'})()()
var t2 = f().call({name: 'baz'})()
var t3 = f()().call({name: 'qux'})

  • foo foo foo
  • bar bar bar
  • qux qux qux
  • bar baz qux
前面说过箭头函数的this是继承父级作用域的this,而不是指向调用者。

var f = fun.call({name: ‘foo’})这一句 会将this指向{name: ‘foo’}。
var t1 = f.call({name: ‘bar’})()(),执行f(),之后返回的都是箭头函数,所以直到最后,父级作用域上的this还是指向{name: ‘foo’}。打印:foo。
下面两个同样,因为t1、t2、t3都是箭头函数,使用call()方法不能改变this指向,作用域链上最近的this还是指向{name:‘foo’}。
本题结果:foo foo foo

 
编辑于 2019-12-02 18:18:19 回复(0)
箭头函数没有自己的this也并不能使用call,apply以及bind去绑定this,会选择去继承父级作用域的this,所以后面几次的call实际上是失败的,所以箭头函数层层向上寻找name,只会在最外层的fun函数作用域中找到this指向{name: 'foo'}对象的name属性。假设此处将fun函数改成箭头函数的声明方式,那么返回的值将会是undefined.
var fun = () => {
    return () => {
        return () => {
            return () => {
                console.log(this.name);
            }
        }
    }
}

fun.call({ name: 'name' })()()(); // undefined


发表于 2019-12-01 21:40:49 回复(0)