【问题标题】:JavaScript function variable scopeJavaScript 函数变量范围
【发布时间】:2016-08-15 05:25:56
【问题描述】:

在下面的代码中,为什么我可以访问变量x.b?它不应该有一个本地范围吗?

代码

function x() {
    var a = 3;
}


x.b = 8;

console.log(x.a);
console.log(x.b);

输出

undefined
8

【问题讨论】:

  • 我想是因为函数是一个你可以访问的对象,而你只是给了它一个新的属性“b”
  • xx.b 都在全局范围内定义。那么,为什么您希望它们具有“本地范围”?
  • 似乎存在一些根本性的误解。点表示法不访问局部变量。
  • 您可能想知道您正在向函数添加属性,这可能不是您的意思。

标签: javascript function scope


【解决方案1】:

当您使用varx 的构造函数中声明a 时,a 被标记为私有,但是当您使用x.b 时,您实际上是在说 - 将属性 b 添加到对象x

因此,当您执行x.b 时,从技术上讲,您正在访问对象x 的属性b,即8。

【讨论】:

  • 但是x在这里不是构造函数,也不是作为一个构造函数使用;这只是一个普通的旧功能。
  • @torazaburo 正确。 x 只是一个普通的旧函数。我以为我上次在某个地方看到了new 关键字……嗯,我一定是累了:(
【解决方案2】:

Javascript 将 x.b 视为一个全局对象。所以你甚至可以在函数内部访问它:

x.b = 8;
function x() {
    var a = 3;
    alert(x.b)
}
x();
console.log(x.a);
console.log(x.b);

但请确保在函数声明之前指定 x.b。

而对象 a 是在函数 x() 中指定的,这使它成为私有的,这就是为什么你会得到 console.log(x.a); 的未定义结果的原因;

如果你这样写:

a = 5;
function x() {
    var a = 3;
}
x.b = 8;

alert(a);
alert(x.b);

你会得到如下结果:

5
8

对于 javascript a 和 x.a 是两个独立的对象。

【讨论】:

    【解决方案3】:

    您已将 x.b 定义为 8,它成为一个全局变量。这意味着您可以从任何地方访问它。

    所以 x() 是一个有自己作用域的函数。因此,您无法以上述方式访问函数范围内的变量。但是,您可以通过执行此操作并调用 x 函数来访问“a”。

    function x() {
      var a = 3;
      return a;
    }
    

    【讨论】:

    • x.b 不是“全局变量”。它是一个名为 x 的对象的属性。
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 2012-06-24
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 2020-02-07
    • 2012-12-23
    相关资源
    最近更新 更多