也许你需要快速接受的基础之一,就是在JavaScript中变量的作用域是如何工作的。关于作用域仅有传闻中的模糊 观念 是不够的。

    作用域与闭包 从揭穿常见的误解开始:JS是“解释型语言”因此是不被编译的。不对。

    JS引擎在你的代码执行的前一刻(有时是在执行期间!)编译它。所以我们首先深入了解编译器处理我们代码的方式,以此来理解它如何找到并处理变量和函数的声明。沿着这条道路,我们将见到JS变量作用域管理的特有隐喻,“提升”。

    对“词法作用域”的极其重要的理解,是我们在这本书最后一章探索闭包时所需的基石。闭包也许是JS所有的概念中最重要的一个,但如果你没有首先牢牢把握住作用域的工作方式,那么闭包将很可能依然不在你的掌握之中。

    闭包的一个重要应用是模块模式,正如我们在本书第二章中简要介绍过的那样。模块模式也许是JavaScript的所有代码组织模式中最流行的一种;深刻理解它应当是你的首要任务之一。

    也许关于JavaScript传播得最广泛和持久的谬误之一是认为this关键字指代它所出现的函数。可怕的错误。

    this关键字是根据函数如何被执行而动态绑定的,而事实上有四种简单的规则可以用来理解和完全决定this绑定。

    this密切相关的是对象原型属性,它是一种属性的查询链,与查询词法作用域变量的方式相似。但是原型中包含的是另一个关于JS的巨大谬误:模拟(山寨)类和继承(所谓的“原型继承”)的想法。

    不幸的是,渴望将类和继承的设计模式思想带入JavaScript只是你能做的最差劲儿的事情,因为虽然语法可能欺骗你,使你认为有类这样的东西存在,但实际上原型机制在行为上是根本相反的。

    目前的问题是,是忽略这种错位并假装你实现的是“继承”更好,还是学习并接纳对象原型系统实际的工作方式更恰当。后者被称为“行为委托”更合适。

    这不光是语法上的偏好问题。委托是一种完全不同的,更强大的设计模式,其中的原因之一就是它取代了使用类和继承进行设计的需要。但是对于以谈论JavaScript的一生为主题的几乎所有的其他博客,书籍,和论坛来说,这些断言绝对是打脸的。

    我对委托和继承做出的宣言不是源于对语言和其语法的厌恶,而是来自于渴望看到这门语言的真实力量被正确地利用,渴望看到无尽的困惑与沮丧被一扫而光。

    但是我举出的关于原型和委托的例子可要比我在这里乱说的东西复杂得多。如果你准备好重新思考你认为你所了解的关于JavaScript“类”和“继承”的一切,我给你一个机会来“服用红色的药丸”,并且看一看本系列的 this与对象原型 的第四到六章。