call, apply疑惑

function foo () {
  console.log(this.age);
}
const age = 18

foo.apply(window) // undefined

为何 用 const/let 定义一个全局变量 age, 并赋值为 18, 用 foo.apply(window)foo.call(window)window.foo() 输出值都是 undefined, 而不是 18 呢? 而用 var age = 18, 结果却为 18?

阅读 3.7k
6 个回答

为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从ES6开始,全局变量将逐步与顶层对象的属性脱钩。
ES6入门

看下 ES6 的书吧:http://es6.ruanyifeng.com/#do...

const 的作用域与 let 命令相同:只在声明所在的块级作用域内有效。

所以 const 出来的值并没有放在 window 对象上。而 var 会。

这个跟call,和apply有关系?
你先console.log(window.age)试试

var 声明的变量既是全局变量又可以看作是window的全局属性。let和const声明的变量只是变量,不是属性。你这样apply让this指向window,他既然不是window属性自然就返回undefined。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题