1

我遇到了这个关于功能范围与块范围的示例代码片段,但我不确定它是如何工作的:

(function () {
  if (true) {
    var x = true;
    console.log("Is 'x' available inside the block? " + x);
  }
  console.log("Is 'x' available outside the block? " + x);
})();

最初,我认为条件是检查声明的变量 x 的值是否为真,并且变量提升的 b/c 可以将条件缩写为 'if(true)' 而不是 'if(x ==真)'。

但是,如果您更改 x 的值以使 x=false,则条件中的代码块仍会执行,并且会触发两个控制台日志,其中 x 的值为“false”。它不应该只执行条件语句之外的控制台日志吗?

如果 x=true,并且条件更改为 'if(false)',则仅执行条件之外的控制台日志,但是.. x 的值未定义。如果变量具有功能范围并且被提升,那么外部控制台日志是否应该执行并且 x=false 的值?

谢谢!

4

2 回答 2

1

变量初始化 ( var x) 总是提升到函数范围,但赋值不是。出于这个原因,在使用它们的函数的顶部初始化所有变量被认为是一种很好的做法。(注意:在 ES6 中,您可以使用块作用域let代替var

在您的示例中,无论条件如何,变量x都在整个函数的范围内。同样值得注意的是,您已经硬编码了条件 ( if (true)); 如果你想对 的值进行分支x,你需要if (x).

这里有一些例子来说明提升:

未初始化(抛出ReferenceError: x is not defined):

    (function() { console.log(x) })()

在无法访问的代码中初始化(返回undefined):

(function() {
  if (false) {
    var x
  }
  console.log(x)
})()

在双重无法访问的代码中初始化(返回undefined!!):

(function() {
  return console.log(x)
  if (false) {
    var x
  }
})()

于 2015-04-04T02:55:24.223 回答
0

Javascript 中不存在块作用域,(除非您使用let语句)只有函数作用域适用于用var语句声明的变量。执行函数时,为变量 x 分配了空间,该空间在该函数中的任何位置都可用,但是,分配仅发生在语句位于函数中的位置。如果条件为假,则永远不会发生分配。x 将undefined在分配之前的任何位置或分配没有发生时具有该值。

于 2015-04-04T03:04:48.623 回答