js预处理和词法分析

js代码在执行前,会有一个预处理的步骤,看代码

    alert(a)
    alert(b)    
    alert(c)
    alert(d)
    var a = 1;
    b = 2;
    alert(b)
    function c() {}
    d = function() {}
    alert(d)

运行上述代码,结果分别是(调试的时候可以注释掉报错的语句)

  1. undefined
  2. 程序报错
  3. "function(){}"
  4. 程序报错
  5. 2
  6. "function(){}"

现在来分析一下,js的预处理是什么意思呢? js代码运行前,js解析器,首先会把var 开头的变量,和声明式定义的函数,放到一个词法环境中 以上述代码为例,js的词法环境是这样的

{
    a : undefined,
    c : 指向函数的引用
}

可以看到,解析器会忽略非var定义的变量和函数表达式,那如果存在重名的情况是则么样的呢? 假设

    function a () {};
    var a = 100;

在js中,函数是一等公民,所以这种情况下,词法环境是这样的

{
    a : 指向函数的引用
}

ok,然后开始正式执行最上面的代码。 当执行到b = 2的时候

{
    a : 1,
    b : 2,
    c: 指向函数的引用
}

词法环境发生了改变, 所以这时候b能打印出来了。d和b同理。

转载于:https://my.oschina.net/sheaned/blog/742119

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值