首页 > 试题广场 >

下列代码的执行结果 var a = 1 function f

[单选题]
下列代码的执行结果
var a = 1
function fn1() {
console.log(this.a)
}
const fn2 = ()=> {
console.log(this.a)
}

const obj = {
a: 10,
fn1: fn1,
fn2: fn2
}

fn1()
fn2()
obj.fn1()
obj.fn2()
  • 1 1 10 1
  • 1 10 10 10
  • 1 10 1 1
  • 1 1 1 10

解析:本题考查this指向问题,以及箭头函数中this指向。
箭头函数中的this始终指向其父级作用域中的this。换句话说,箭头函数会捕获其所在的上下文的this值,作为自己的this值。在箭头函数中调用 this 时,仅仅是简单的沿着作用域链向上寻找,找到最近的一个 this 拿来使用,它与调用时的上下文无关。

  • fn1()中,this指向window,所以打印1
  • fn2()中,fn2是一个箭头函数,this指向作用域链上最近的this,这里为window,所以打印1.
  • obj.fn1()中,fn1是一个普通函数,this指向obj,即obj.a。所以打印10。
  • obj.fn2()中,fn2是一个箭头函数,this会继承父级作用域中的this,为window。所以打印1.
    本题最终结果:1 、1、10、1

 

编辑于 2019-12-02 18:16:56 回复(1)
首先,第一个函数是一个普通函数,众所周知,普通函数this指向window。而全局声明的var默认是window下,这也是js败笔之处,会污染全局变量然后他就会去window下找,诶,找到了。 其次,箭头函数没有this,所以要去父作用域找而父作用域是全局window下,所以他也找到了。 再次,对象里的方法this指向对象,对象下面的a=10,第一个就是10 最后,由于箭头函数里没有this,也就是说他不会找对象的this,因为本来就没有,指向,于是就去对象的外部作用域找this,所以是1
发表于 2019-12-04 13:13:29 回复(0)
箭头函数this指向上级作用域this指向
fn1()的this指向window打印1
fn2()的this指向作用域链上最近的this也就是window,打印1
obj.fn1()的this指向obj对象,即obj.a = 10
obj.fn2()的this继承父级作用域中的this,window。打印1.
发表于 2020-09-08 22:23:54 回复(0)
obj.fn2()中,fn2是箭头函数,this指向其最近的父作用域,为什么不指向obj,输出10呢?
因为js中对象的{}不是作用域,只是代码块,所以最近的父作用域为window,输出1
发表于 2020-07-24 22:45:17 回复(0)
“箭头函数”的this,总是指向定义时所在的对象,而不是运行时所在的对象。
发表于 2020-09-24 23:33:40 回复(0)

1 1 10 1

发表于 2020-02-11 16:52:30 回复(0)