【问题标题】:Javascript: Why variable in global scope becomes property of its 'this' but it doesn't happen on variable inside functional scope for new objectJavascript:为什么全局范围内的变量成为其“this”的属性,但它不会发生在新对象的功能范围内的变量上
【发布时间】: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,结果未定义。

  1. 为什么在全局命名空间中声明变量会使该变量成为this(global namespace = Window) 的属性?
  2. 为什么在创建新对象时第 1 项的行为不会发生在功能范围内?

【问题讨论】:

  • 这就是 JavaScript 的工作原理。浏览器 JavaScript 中的全局 var 声明创建 window 属性,而函数范围内的 var 声明从不创建对象属性。
  • 将变量声明为函数的局部变量并不会使其成为函数对象的属性。
  • 全局命名空间是唯一的;你的问题基本上是“为什么 JS 是这样设计的?”答案是“因为它就是这样设计的。”
  • global namespace = Window 就是这样。您回答了自己的问题...

标签: javascript namespaces global-variables


【解决方案1】:

为什么在全局命名空间中声明一个变量会使该变量成为 this(global namespace = Window) 的属性?

因为this在全局范围内是对变量所在对象的引用。

为什么在创建新对象时第 1 项的行为不会发生在功能范围内?

因为this 在函数范围内的行为与在全局范围内的行为不同。

在具有this 绑定的函数中,其值由函数的调用者确定,并且可以是几乎任何对象(甚至是严格模式下的原语)。

【讨论】:

    【解决方案2】:

    将变量声明为函数的局部变量确实使其在该函数的范围内,但不会使其成为函数对象的属性。使用 this 关键字时,您将函数作为 object 引用,因此可以将变量作为该对象的属性分配给它。

    【讨论】:

    • 这不能回答问题。你所说的一切都已经是问题的一部分。 OP 在问为什么会这样。
    【解决方案3】:

    this 在全局范围内是对变量所在对象的引用。

    全局命名空间 = 窗口。你自己说的

    在带有this绑定的函数中,其值由函数的调用者设置

    进一步阅读

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

    【讨论】:

      猜你喜欢
      • 2016-11-13
      • 2017-09-26
      • 1970-01-01
      • 2017-09-30
      • 2017-03-05
      • 1970-01-01
      • 2015-12-16
      • 2017-12-02
      • 1970-01-01
      相关资源
      最近更新 更多