我遇到了关于功能范围与块范围的示例代码片段,但我不确定它是如何工作的:
(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的值?
谢谢!
答案 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
,或者如果分配没有发生。