作用域和闭包
编译过程:词法分析 语法分析 代码生成
引擎 从头到尾负责整个 JavaScript 程序的编译及执行过程。
编译器 引擎的好朋友之一,负责语法分析及代码生成等脏活累活(详见前一节的内容)。
作用域 引擎的另一位好朋友,负责收集并维护由所有声明的标识符(变量)组成的一系列查 询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。
LHS 和** RHS** 的含义是“赋值操作的左侧或右侧”并不一定意味着就是“= 赋值操作符的左侧或右侧”。赋值操作还有其他几种形式,因此在概念上最 好将其理解为“赋值操作的目标是谁(LHS)”以及“谁是赋值操作的源头 (RHS)”。
RHS 理解成 retrieve his source value(取到它的源值)
LHS 理解成 retrieve his source value(给他的赋值)
欺骗词法
eval
JavaScript 中的 eval(..) 函数可以接受一个字符串为参数,并将其中的内容视为好像在书 写时就存在于程序中这个位置的代码。换句话说,可以在你写的代码中用程序生成代码并 运行,就好像代码是写在那个位置的一样。
with
with 通常被当作重复引用同一个对象中的多个属性的快捷方式,可以不需要重复引用对象 本身。
b: 2,
c: 3 };
// 单调乏味的重复 "obj" obj.a = 2;
obj.b = 3;
obj.c = 4;
// 简单的快捷方式 with (obj) {
a = 3;
b = 4;
c = 5;
}
this和原型对象
this的绑定规则
默认 隐 显 new
this的绑定优先级
被忽略的this
Object.create(null) 和 {} 很像,但是并不会创建 Object. prototype 这个委托,所以它比 {}“更空”:
function foo(a,b) {
console.log( "a:" + a + ", b:" + b );
}
// 我们的 DMZ 空对象
var ø = Object.create( null ); // 把数组展开成参数
foo.apply( ø, [2, 3] ); // a:2, b:3
// 使用 bind(..) 进行柯里化
var bar = foo.bind( ø, 2 );
bar( 3 ); // a:2, b:3