面试官:在全局作用域下声明的变量一定会成为Global对象的属性吗?
分类:javascript
全局变量在浏览器和Node环境下的区别
我们知道,在JavaScript中声明的全局变量,会变成Global对象的属性。这个Global对象在浏览器中为window对象,在Node环境下为global对象。
看下面这段简单的代码:
var name = 'jack'
console.log(this.name) //输出什么?
根据上面的分析,显然会打印出jack。
我们用Chrome试一下。
确实没错。
按理说,在Node环境下,应该也是相同的结果。
我们试下:
结果似乎出人意料:同样的代码,在浏览器和Node环境下,竟然出现了不同的结果。
从上面的测试代码我们可以看出:用 var 声明的变量,在浏览器环境下会成为window对象的属性,而在Node环境下不会成为global对象的属性。
那如果用 let 呢?是和 var 表现一样,还是有所区别?
用 let 声明的全局变量不会成为window对象的属性
《JavaScript高级程序设计》里写得很清楚:
与var关键字不同,使用 let 在全局作用域中声明的变量不会成为window对象的属性。
例如:
var name = 'Matt'在这里插入代码片
console.log(window.name) // 'Matt'
let age = '26'
console.log(window.name) //undefined
我们也可以直接将window打印出来:
可以看到,window对象里的确只有用 var 声明的变量。
总结
- 使用 var 声明的全局变量,在浏览器环境下会成为window对象的属性,在Node环境下不会成为global对象的属性。
- 使用 let 声明的全局变量,即便在浏览器环境下不会成为window对象的属性。
作者:掘金-面试官:在全局作用域下声明的变量一定会成为Global对象的属性吗?