JavaScript中的预解析顺序(优先级)

参考链接1: JavaScript函数声明前置与变量声明
参考链接2: javascript的执行顺序


处理执行上下文代码分为两个阶段:
  1. 进入执行上下文
  2. 执行代码
进入执行上下文:
进入执行上下文,方法的变量对象(VO)就会被以下属性填充
  1. 参数,参数名就是VO中的名称。值就是实参的值。如果没有传递,则为undefined
  2. 函数声明,如果VO中中已经存在相同的属性,则替换它的值
  3. 变量声明:通过var声明的。在VO中的值为undefined,如果VO中已经含有相同的属性,则不会影响已经存在的属性。

案例1:
var n = 1;
fn(n);
function fn() {
    console.log(n);
    var n = 2;
}

打印结果:

undefined

解释:

1, 因为函数预解析,所以fn()可以在前边执行
2,fn函数执行的时候,内部预解析,n变量提升,但是不赋值,此时为undefined。


案例2:
var n = 1;
fn(n);
function fn(n) {
    console.log(n);
    var n = 2;
}

打印结果:

1

解释:

1, 因为函数预解析,所以fn()可以在前边执行
2,fn函数执行的时候,内部预解析,先对实参预解析,且赋值为实参的值1,var声明的n变量提升,由于已经存在n,所以不会重新定义变量。


案例3:
var n = 1;
fn(n);
function fn(n) {
    console.log(n);
    function n() {
        console.log(666);
    }
    var n = 2;
}

打印结果:

function n() {
            console.log(666);
        }

解释:

1, 因为函数预解析,所以fn()可以在前边执行
2,fn函数执行的时候,先给预解析完成的形参赋值,再进行函数内部的预解析

内部预解析解读如下所示:

n = 1;//实参赋值,由undefined变为1
n = function() {
        console.log(666);
    }//n被重新赋值
var n = undefined;//由于已经存在n变量,变量不会被重复声明。所以此句会被忽略

个人理解总结:

1,预解析的顺序是从上到下,函数的优先级高于变量,函数声明提前到当前作用域最顶端,在var之上。
2,函数执行的时候,函数内部才会进行预解析,如果有参数,先给实参赋值再进行函数内部的预解析。
3,预解析函数是声明+定义(开辟了内存空间,形参值默认是undefined)。
4,预解析变量是只声明,不赋值,默认为undefined。
5,函数重名时,后者会覆盖前者。
6,变量重名时,不会重新声明,但是执行代码的时候会重新赋值。
7,变量和函数重名的时候,函数的优先级高于变量。


以上内容作为个人学习记录使用,仅供参考,不足之处,烦请告知。

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值