当我在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
(全局名称空间=窗口)的属性。我在第2行上打印this.ss
以确认
在第7行上,我声明了变量second
,但它并不成为其this
的属性(人物对象的函数命名空间)。在第8行上,我打印this.second
,结果未定义。
- 为什么在全局名称空间上声明变量使该变量成为
this
的属性(全局名称空间=窗口)? - 为什么在创建新对象时,项目1上的行为不会发生在功能范围内?
为什么在全局名称空间上声明变量使该变量成为此属性(全局名称空间=窗口)?
因为全局范围中的this
是对变量居住的对象的引用。
为什么在创建新对象时,项目1上的行为不会发生在功能范围内?
因为函数范围中的this
的行为与全局范围中的行为不同。
在具有 this
绑定的函数中,其值由函数的呼叫者确定,并且可能是任何对象(甚至是严格模式下的原始对象)。
声明函数本地变量的确使其在该函数的范围内,但并不使其成为函数对象的属性。使用this
关键字时,您将函数引用为object
,因此可以将变量分配为该对象的属性。
this
在全局范围中是对变量驻留的对象的引用。
全局名称空间=窗口。你自己说了
在具有this
绑定的函数中,其值由函数的呼叫者设置
进一步阅读
https://developer.mozilla.org/en-us/docs/web/javascript/reference/reference/operators/this