首页 > Windows开发 > 详细

关于let声明的变量在window里无法获取到的问题

时间:2020-09-30 16:45:47      阅读:46      评论:0      收藏:0      [点我收藏+]

首先来看一个例子:

技术分享图片

 乍一看,感觉很简单,第一个fn()函数里面的this指向的是window,但是执行结果发现fn()输出的是 undefined。

为什么会出现这个问题根本原因就是ES6和ES5变量声明的区别:

1.ES5声明变量只有两种方式  :var 和 function

2.ES6 声明变量的方式有: let const  import  class 再加上ES5的var  function 一共是有6种声明变量的方式

这里还要了解一个概念就是: 顶层对象。浏览器的顶层对象是window,Node中的是global对象

ES5中的顶层对象的属性等价于全局变量。

ES6中,var function 声明的全局变量依然是顶层对象的属性;let const class import 声明的全局变量不属于顶层对象的属性。

也就是说ES6开始,全局变量和顶层对象的属性开始分离,脱钩。

所以ES6非严格模式下,与var声明的全局变量都会成为window的属性

技术分享图片

 而使用let声明的全局变量,不会成为window的属性

技术分享图片

 至于

 技术分享图片

 是因为Person.say(fn) 中 fn 直接作为入参 此时 arguments 打印出来就是带有fn()函数的数组

技术分享图片

此时 arguments[0] 就是fn , 所以 arguments[0]() 就是类似(arguments.fn() , fn()中的this.len中的this就是指向arguments)此时arguments中没有len属性,所以打undefined。

如果给arguments自定义一个len属性就可以成功打印数值,如下:

技术分享图片

稍微再改一下代码就会有不一样的结果,修改如下:

技术分享图片

 解析过程:arguments[0]() 的结果是1,

技术分享图片

 

关于let声明的变量在window里无法获取到的问题

原文:https://www.cnblogs.com/moringyaozheng/p/13754885.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!