【发布时间】:2018-05-14 20:59:48
【问题描述】:
当我在 Chrome 浏览器上运行以下代码时,我检测到在全局命名空间中声明变量和在功能命名空间内为新对象声明变量之间存在不同的行为。
1. var ss = 'text';
2. console.log(this.ss);
3. function Person(first){
4. console.log('inside');
5. console.log(this);
6. this.firstName = first;
7. var second = 'Qui';
8. console.log(this.second);
9. }
10. var person1 = new Person('Leo');
在第 1 行,我声明了变量 ss,它成为 this 的属性(全局命名空间 = Window)。我在第 2 行打印 this.ss 以确认。
在第 7 行,我声明了变量 second,但它没有成为其 this 的属性(Person 对象的函数命名空间)。在第 8 行,我打印了this.second,结果未定义。
- 为什么在全局命名空间中声明变量会使该变量成为
this(global namespace = Window) 的属性? - 为什么在创建新对象时第 1 项的行为不会发生在功能范围内?
【问题讨论】:
-
这就是 JavaScript 的工作原理。浏览器 JavaScript 中的全局
var声明创建window属性,而函数范围内的var声明从不创建对象属性。 -
将变量声明为函数的局部变量并不会使其成为函数对象的属性。
-
全局命名空间是唯一的;你的问题基本上是“为什么 JS 是这样设计的?”答案是“因为它就是这样设计的。”
-
global namespace = Window就是这样。您回答了自己的问题...
标签: javascript namespaces global-variables