资讯专栏INFORMATION COLUMN

从连续赋值到:词法分析、函数执行原理

rose / 1962人阅读

摘要:先说下这个老话题连续赋值例结果是什么这句简单,而这句呢答案是,变成了全局变量了这是实际执行顺序未使用声明,所以变全局变量了例很早以前的面试题目了,相信很多人知道答案,考点词法分析执行顺序运算符优先级等这是我理解的实际执行顺序我是这么猜想的自

先说下这个老话题:连续赋值

例1:

function a(){ 
    var o1 = o2 = 5; 
} 
a(); 
console.log(o1); 
console.log(o2); 

结果是什么?console.log(o1);这句简单undefined,而console.log(o2);这句呢?答案是5,o2变成了全局变量了
这是实际执行顺序:

var o1; 
o2 = 5; //o2未使用var声明,所以变全局变量了 
o1 = o2;

例2:

var foo = {n:1}; 
var bar = foo; 
foo.x = foo = {n:2}; 
console.log(foo.x); 
console.log(bar.x); 

很早以前的面试题目了,相信很多人知道答案,考点:词法分析、执行顺序、运算符优先级等
这是我理解的实际执行顺序:

var foo; 
var bar; 
foo = {n:1}; 
bar = foo; //bar = {n:1} 
foo.x = undefined; // 
foo.x = (foo = {n:2}); 
console.log(foo.x); //undefined 
console.log(bar.x); //{ n: 2 } 

我是这么猜想的:自我感觉勉强说的通,有不对的地方请指出!
JS引擎遇到foo.x = foo = {n:2}; 词法分析为foo.x, =, foo, =, {n:2}
执行顺序:

先为foo添加x属性,未赋值(undefined),这里的foo还是{n:1}

遇到第一个"=",准备为x赋值

"="优先级最低,先计算右边表达式的值

执行foo = {n:2},并将该赋值表达式的结果值{n:2}赋值给之前的foo.x

最终foo的引用指向了{n:2},不存在属性x
而bar的引用没变,始终指向原来的{n:1},而{n:1}被添加了x属性{n:2}变为{n:1,x:{n:2}},这就是最后bar引用的值

下面给大家介绍下JS的词法分析
以下内容参考:《javascript权威指南》《你不知道的javascript》

JS 解析器在执行语句前会将函数声明和变量定义进行"预编译",而这个"预编译",并非一个页面一个页面地"预编译",而是一段一段地预编译,所谓的段就是一 个

阅读需要支付1元查看
<