js的高级知识 —— 词法分析

一、词法分析方法

js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤:

  • 分析参数
  • 再分析变量的声明
  • 分析函数说明

二、具体步骤

函数在运行的瞬间,生成一个活动对象(Active Object),简称AO
1.分析参数

  • 函数接收形式参数,添加到AO的属性,并且这个时候值为undefined,即AO.age=undefined
  • 接收实参,添加到AO的属性,覆盖之前的undefined

2.分析变量声明:如var age;或var age=23;

  • 如果上一步分析参数中AO还没有age属性,则添加AO属性为undefined,即AO.age=undefined
  • 如果AO上面已经有age属性了,则不作任何修改

3.分析函数的声明,如果有function name(){}把函数赋给AO.name ,覆盖上一步分析的值

例子1:

function t1(age) {
  console.log(age);
  var age = 27;
  console.log(age);
  function age() {}
  console.log(age);
}
t1(3);

词法分析阶段:

首先形成Active Object即AO对象
分析形式参数
  • AO.age = undefined
  • 传入实参即对AO.age=undefined进行覆盖:AO.age = 3
分析局部变量
  • 存在var age = 27;
  • 这个时候遵循如果AO.age存在值则不作任何修改,按照第一步分析的最后结果AO.age = 3,所以这里不作任何修改即:AO.age = 3
分析函数的声明
  • 因为函数中存在function age(){}函数
    所以按照规则应该将函数赋值给AO.age覆盖第二步分析的AO.age = 3即: AO.age = function age(){}
执行阶段
  • 执行t1函数,到console.log(age)时,词法分析的最后AO.age= function age(){},所以会打印:
    function age(){}
  • var age=27;给age赋值27,到第二个console.log(age)这个时候age已经重新被赋值27,所以这个时候会打印:27
  • function age() 并没有调用所以并不会执行
    到第三个console.log(age)这个时候age的值并没有被再次修改,所以这个时候会打印:27
    运行js查看结果如下与我们分析的完全相符:
    image.png

例子2:

function t1(age) {
  var age;
  console.log(age);
  age = 23;
  console.log(age);
  function age() {
    console.log(age);
  }
  age();
  console.log(age);
}
t1(22);

词法分析阶段:

首先形成Active Object即AO对象
分析形式参数
  • AO.age = undefined
  • 传入实参即对AO.age=undefined进行覆盖:AO.age = 22
分析局部变量
  • 这个时候遵循如果AO.age存在值则不作任何修改,所以这里不作任何修改即:AO.age = 22
分析函数的声明
  • 因为函数中存在function age(){}函数
    所以按照规则应该将函数赋值给AO.age覆盖第二步分析的AO.age = 22即: AO.age = function age(){}
执行阶段
  • 执行t1函数,到console.log(age)时,词法分析的最后AO.age= function age(){},所以会打印:
    function age(){}
  • age = 23,这个时候会覆盖原来的function age(){console.log(age)},所以第二个console.log(age)会打印:23
  • function age() 并没有调用所以并不会执行
    age() 这个时候的age还是23,并不是函数表达式,所以这里会报错
    运行js查看结果如下与我们分析的完全相符:


    image.png

三、补充说明,函数声明与函数表达式

//函数声明
function a() {}
//函数表达式
var b = function () {};

a和b在词法分析时,区别:

a在词法分析时,就发挥作用;
b只有在执行阶段,才发挥作用。

词法作用域
所谓词法作用域是说,其作用域为在定义时(词法分析时)就确定下来的,而并非在执行时确定。白话就是在函数未执行前,函数执行的顺序已经被确定,而不是类似JAVA一样,是在执行前根本不知道执行顺序。

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

推荐阅读更多精彩内容