call, apply疑惑

发布于 2022-09-04 15:24:05 字数 392 浏览 32 评论 0

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

蛮可爱 2022-09-11 15:24:05

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

静若繁花 2022-09-11 15:24:05

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

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

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

何以心动 2022-09-11 15:24:05

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

权谋诡计 2022-09-11 15:24:05

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

↘紸啶 2022-09-11 15:24:05

全局中let和const不再添加到window上

从ES6开始,全局变量将逐步与顶层对象的属性脱钩。
去看顶层对象的属性部分

朱染 2022-09-11 15:24:05

希望对你有帮助,关于call()和apply()方法:
http://uule.iteye.com/blog/11...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文