所以我正在阅读this书,跟随代码示例并使用节点控制台运行它们。在第7章段落'词汇与动态范围'中,作者声称以下代码将导致错误:
const x = 3;
function f() {
console.log(x); // this will work
console.log(y); // this will cause a crash
}
const y = 3;
f();
这是因为(如本书所示)
JavaScript中的范围是词法......
和
词法作用域意味着你定义函数的范围内的任何变量(与你调用它时相反)都在函数的范围内。
但是这段代码运行得很好,并产生以下输出:
3
3
我已经搜索了词法范围的其他例子及其含义,但它们似乎都暗示了与本书所说的略有不同的东西。所以我想知道,书中的解释是完全错误还是我遗漏了一些非常基本的东西?
答案 0 :(得分:2)
引用的说明......
词法作用域意味着你定义函数的范围内的任何变量(与你调用它时相反)都在函数的范围内。
......是对的。
代码示例错误。函数f
可以访问声明它的作用域中存在的任何变量(或常量)。本书出现的错误是在声明函数后可以将常量添加到该作用域。
声明功能很重要。宣布时,不是那么多。
答案 1 :(得分:0)
上面的代码可以正常工作。但是,这将失败。
select * from r166 where cgi like "%3505257008";
这是因为在函数调用和
时尚未声明或定义y const x = 3;
function f() {
console.log(x); // this will work
console.log(y); // this will cause a crash
}
f();
const y = 3;
是可访问的,因为范围是词汇的,如果在本地找不到,函数将访问全局范围中定义的x
。
这个例子可以更清楚地理解
x
根据词汇全局范围function b(){
console.log(v) //=> 1
} //lexically defined at global scope
function a(){
var v = 2
console.log(v) //=> 2
b() //called in the scope of a()
}
var v = 1
a()
console.log(v) //=> 1
,console.log
中的 b()
将给出1。但根据动态范围(由v = 1
创建),它应该是2,但事实并非如此。
希望这会有所帮助:)
答案 2 :(得分:0)
这本书看起来很旧 - 11年前。世界不再相同。现在我们看到JavaScript日复一日地发生变化。我认为我们不应该使用自2年前以来制作的任何书籍。
你(和书)提到的问题与另一个概念有关:严格模式。在ECMAScript 5中,您可以通过在JavaScript文件的顶部添加“use strict”来打开此模式。所以,你会看到一些错误抛出,而不是常规模式。如果你想让这个例子有用,你可能需要找一个旧的浏览器,IE8等 - 我不确定,然后创建一个HTML文件,然后添加你的脚本,然后打开严格模式,它可能会给你与作者说的结果相同。
今天的JavaScript不再是严格模式了 - 我想谈谈ECMAScript 6,ES6或ECMAScript 2015.我们现在编写JavaScript时不需要关心严格模式。我在npmjs.org上有很多模块,但它们都没有“use strict”声明。
仅仅是我的两分钱:在编程中,不要阅读旧书,因为一切都变化得太快了。