javascript - 在 JavaScript 中,当局部变量被提升时,它是否在声明之前就在范围内?

标签 javascript scope hoisting

在书 Secrets of the JavaScript Ninja 中,p. 43 - 46,它有一些代码如下:

function assert(flag, msg) {
    if (!flag) {
        console.log("Assertion failed for: " + msg);
    }
}

function outer() {
    var a = 1;

    function inner() { }

    assert(typeof b === "number", "b is in scope");
    var b = 1;
}

outer();

结论是,由于断言失败,“b 不在范围内,直到它被声明”。但我认为情况并非如此,因为首先,b 可能已经有一个本地范围,但它还不是一个“数字”。 b 实际上已经是局部作用域 b,并且会隐藏任何全局 b

例如:

var b = 123;

function foo() {
    b = 456;

    var b = 789;
}

foo();

console.log(b);   // prints out 123

因为它打印出了123,所以我们可以看到当b = 456;这行被执行的时候,b已经是本地的了范围 b。 (即使在赋值之前它还未初始化)。

此外,我们可以将其打印出来而不是分配给 b:

var b = 123;

function foo() {
    console.log(b);  // prints out undefined

    var b = 789;
}

foo();

console.log(b);     // prints out 123

再一次,我们可以看到第一个打印出来的不是123而是undefined,这意味着b是一个局部作用域b,因此 b 实际上已经在本书示例的范围内。

以上描述和概念是否正确?

最佳答案

的确,这本书的结论是错误的。 var b anywhere inside a function 表示 b 存在于函数内anywhere。这就是“吊装”。所有 varfunction 声明都被提升到顶部,无论它们出现在范围中的什么位置。 尚未分配。

关于javascript - 在 JavaScript 中,当局部变量被提升时,它是否在声明之前就在范围内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14997277/

相关文章:

c - GCC/clang 编译错误,函数作用域静态指针指向未命名数组

javascript - JavaScript 中提升名称解析顺序如何工作?

javascript - 为什么我无法获取由于提升而导致的 javascript

clojure - 绕过clojure中缺少 "hoisting"

javascript - Knockout js 从其他 View 模型收集数据

javascript - 使用 Google api 获取城市的州/国家建议

javascript - 使用表行值构建关联数组

javascript - Web 服务器上的 NodeJS 应用程序导致 fork 炸弹 - bash : fork: retry: No child processes

r - 限制变量范围

r - 将函数从参数传递到嵌套函数