JavaScript核心技术开发解密读书笔记(第四章)

第四章 变量对象

1. 创建过程

变量对象的创建,依次经历了一下几个过程。
1.在chrome浏览器中,变量对象会首先获得函数的参数变量及其值;在firefox浏览器中,是直接将参数对象arguments保存在变量对象中。
2.依次获取当前上下文中所有的函数声明,也就是使用function关键字生命的函数。在变量对象中会以函数名建立一个属性,属性值为指向该函数所在的内存地址引用。如果函数名的属性已经存在,那么该属性的值会被新的引用覆盖。
3.依次获取当前上下文中的变量声明,也就是使用var关键字声明的变量。每找到一个变量声明,就在变量对象中就以变量名建立一个属性,属性值为undefined。如果该变量名的属性已经存在,为了防止同名的函数被修改为undefined,则会直接跳过,原属性不会被修改。
了解了以上过程之后,结合《你不知道的JS(上)》提升一节,我们来看几个例子。

2. 几个例子
  1. 变量提升(先有鸡还是先有蛋)
a = 2;
var a;
console.log(a); // 2

很多人会认为是undefined,因为var a声明在a = 2之后,他们自然而然地认为变量被重新复制了,因此会赋予默认值undefined,但是真正的输出结果是2。我们再来看另外一个。

console.log(a); // undefined
var a = 2;

鉴于上一个代码片段所表现出来的某种非自上而下的行为特点,你可能会认为这个代码也会有同样的行为而输出2。还有人可能会认为,由于变量a在使用前没有先进行声明,因此会跑出ReferenceError异常。不幸的是两种猜测都是不对的,输出来的是undefined。

正确的思考思路是,包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理。

当你看到var a = 2;时,可能会认为这是一个声明。但是JavaScript实际上会将其看成两个声明var a;a = 2;。第一个声明是在编译阶段进行的。第二个赋值声明会被留在原地等待执行阶段。
我们第一个代码片段会以如下形式进行处理。

var a; // 编译
a = 2; // 执行
console.log(a); // 2

类似地,我们第二个代码片段实际是按照以下流程处理的。

var a; // 编译
console.log(a); // undefined
a = 2; // 执行
  1. 函数相关提升
foo();
function foo () {
  console.log(a); // undefined
  var a = 2;
}

这里可以看到,foo函数的声明被提升了,因此第一行中的调用可以正常执行。

foo(); // TypeError
var foo = function () {
  // ...
}

这段程序中的foo函数被提升并分配给全局作用域,因此foo();不会导致ReferenceError。但是foo此时并没有赋值(如果它是一个函数声明而不是函数表达式,那么就会赋值)。foo()对于undefined值进行函数调用而导致非法操作,因此会跑出TypeError异常。

只有声明本身会被提升,而赋值或其他运行逻辑会留在原地。

同时也要记住,即使是具名的函数表达式,名称标识符在赋值之前也无法在所在作用域中使用。

foo(); // TypeError
bar(); // ReferenceError
var foo = function bar () {
  // ...
}

这个代码片段经过提升后,实际上会被理解为以下形式。

var foo;
foo(); // TypeError
bar(); // ReferenceError
foo = function () {
  var bar = ...self...
  // ...
}
  1. 函数优先

函数声明和变量声明都会被提升,但是一个值得注意的细节是函数会首先被提升,然后才是变量

foo(); // 1
var foo;
function foo () {
  console.log(1);
}
foo = function () {
  console.log(2);
}

这段代码会输出1而不是2,原因是这段代码会被JS引擎理解为如下形式:

function foo () {
  console.log(1);
}
foo(); // 1
foo = function () {
  console.log(2);
}

注意:var foo尽管出现在function foo () ...的声明之前,但它是重复的声明(因此会被忽略),因为函数声明会被提升到普通变量之前。
尽管重复的var声明会被忽略掉,但出现在后面的函数声明还是可以覆盖前面的。

foo(); // 3
function foo () {
  console.log(1);
}
var foo = function () {
  console.log(2);
}
function foo () {
  console.log(3);
}

最后附上书中一道例子,结合前面所讲的,留给各位作为思考题,知道答案的小伙伴请在在评论区留下你的答案。

test();
function test () {
  console.log(foo);
  console.log(bar);
  var foo = 'Hello';
  console.log(foo);
  var bar = function () {
    return 'world';
  }
  function foo () {
    return 'hello';
  }
}

以上是我对JavaScript核心技术开发解密第四章的读书笔记,码字不易,请尊重作者版权,转载注明出处。
By BeLLESS 2018.6.23 00:17

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容