变量提升如何在这个JS示例中起作用:if(true){...}

时间:2015-04-04 02:45:04

标签: javascript variables scope functional-programming hoisting

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

(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)'而不是'如果(X == TRUE)”

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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

变量初始化(var x)始终提升到函数范围,但赋值不是。因此,在使用它们的函数顶部初始化所有变量被认为是一种很好的做法。 (注意:在ES6中,您可以使用block-scoped 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
  }
})()

答案 1 :(得分:0)

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

相关问题