首页 > 试题广场 >

请问以下JS代码的输出结果会是什么 var a = 'w'

[单选题]
请问以下JS代码的输出结果会是什么
var a = 'w' 
let obj = {
  a: 'o',
  print: function() {
    console.log(this.a);
  },
  print2: () => { 
    console.log(this.a);
  }
}
let p = obj.print;
let p2 = obj.print2;
obj.print();
obj.print2();
p();
p2();


  • o、 undefined、 undefined、undefined
  • o、 w、 undefined、 undefined
  • o、 w、 w、 undefined
  • o、 w、 w、 w
普通函数,this永远指向它的调用者;箭头函数,this指向定义时的上下文
obj.print() ===> obj调用的普通函数,this指向调用者obj这个对象,所以this.a就是obj.a,即为 'o';
obj.print2() ===> obj调用的箭头函数,this指向上下文,即全局作用下的window,所以this.a就是window.a,即为 'w';
let p = obj.print; p() ===> p是在全局作用域下的,p指向了print(){}函数的地址,执行时是在全局作用域下调用的,所以this指向window,this.a就是window.a,即为 'w';
let p2 = obj.print2; p2() ===> 虽然p2是在全局作用域下的,但是p2指向了print2: () => {}箭头函数的地址,所以this指向print2函数定义时的上下文,即window,this.a就是window.a,即为 'w';
所以,最终输出为:'o', 'w', 'w', 'w'



发表于 2022-01-25 10:25:40 回复(6)
一般函数的this指向调用者,箭头函数的this与最外层的this保持一致。
发表于 2021-12-09 22:12:46 回复(4)
调用 obj.print2() 时,如果是普通函数,该方法内部的 this 指向 obj ;如果写成上面那样的箭头函数,使得 this 指向全局对象,因此不会得到预期结果。这是因为对象不构成单独的作用域,导致 print2 箭头函数定义时的作用域就是全局作用域。

发表于 2021-12-14 10:33:11 回复(0)
对象不构成作用域,导致剪头函数的定义上下文为全局作用域
发表于 2022-03-02 07:37:20 回复(0)
为什么不是owow,求解
发表于 2021-12-18 00:24:19 回复(2)
发表于 2022-02-26 20:15:17 回复(2)
node里面没有window全局,node里面把模块当成函数调用了,绑定了undefined这个this
发表于 2022-05-30 00:39:23 回复(0)
要重哪里开始写呀

发表于 2023-04-18 18:26:41 回复(0)
为啥 不是 o,w,undefind,undefind呢。 p 和 p2 都是 使用let 声明的,let申明的对象 是不会挂载在 window 对象下的,也就是说 在执行 p 和 p2的时候,里面的this 是没有 指向 window的。 如果 是用 var申明的 答案 就应该是 o,w,w,  w。反正我感觉 是有点问题 
发表于 2023-03-06 10:46:28 回复(0)
发表于 2022-08-31 14:20:22 回复(0)
普通函数,this永远指向它的调用者;箭头函数,this指向定义时的上下文。(定义的时候就已经确定了)
发表于 2022-07-19 23:35:40 回复(0)
在 nodejs 和 浏览器环境下结果应该是不一样的吧
发表于 2022-03-29 18:35:53 回复(0)
如果第一行是let a = 'w'
那么选A就正确了
因为var声明的变量是在全局声明的,所以this可以访问
而let声明的变量this就访问不了
发表于 2022-02-23 15:17:45 回复(0)