JavaScript函数变量作用域

3
在下面的代码中,为什么我可以访问变量x.b?它不应该具有局部作用域吗? 代码
function x() {
    var a = 3;
}


x.b = 8;

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

输出

undefined
8

我认为因为函数是一个可以访问的对象,而且你刚给它添加了一个新属性 "b"。 - Jeremy Kahan
1
xx.b都是在全局范围内定义的。你为什么期望它们具有“局部范围”呢? - str
1
似乎存在一些基本误解。点符号表示法不能访问局部变量。 - Raymond Chen
1
你可能需要注意,你正在给一个函数添加一个属性,这可能不是你想要的。 - user663031
3个回答

3
当你在x的构造函数中使用var声明a时,a被标记为私有。但是当你执行x.b时,实际上是在对对象x添加属性b
因此,当你执行x.b时,严格来说是访问对象x的属性b,其值为8。

但是在这里,x不是一个构造函数,也不是被用作构造函数;它只是一个普通的旧函数。 - user663031
@torazaburo 正确。x只是一个普通的函数。我记得上次看到过new关键字... 嗯,我可能有点累了 :( - Samuel Toh

0
你定义了x.b为8,这使它成为了一个全局变量。这意味着你可以从任何地方访问它。
因此,x()是一个具有自己作用域的函数。因此你不能以提到的方式访问函数作用域内的变量。但是,你可以通过这种方式访问'a'并调用x函数。
function x() {
  var a = 3;
  return a;
}

1
x.b 不是一个“全局变量”。它是一个名为 x 的对象上的属性。 - user663031

0
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 是两个独立的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接