学习JavaScript:词汇与动态范围

时间:2017-06-17 08:47:15

标签: javascript lexical-scope

所以我正在阅读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

我已经搜索了词法范围的其他例子及其含义,但它们似乎都暗示了与本书所说的略有不同的东西。所以我想知道,书中的解释是完全错误还是我遗漏了一些非常基本的东西?

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”声明。

仅仅是我的两分钱:在编程中,不要阅读旧书,因为一切都变化得太快了。