在js中的预解析规则理解

一.作用域

  1. 作用域:作用的范围,指的是函数在哪些范围内可以用,而在其他部分就不可以使用,如果需要使用就需要重新定义。也可以理解为程序源代码中定义的这个变量的区域。
  2. 作用域的作用:用来执行读或者写的操作。

二、预解析规则

  1. 预解析规则: 对于script是自上而下进行解析,对于函数是由里到外进行解析。
  2. 浏览器在执行JS代码的时候会分成两部分操作:预解析以及逐行执行代码。
  3. 预解析:浏览器在开始工作的时候会先解读JS代码的关键字:比如:var function 参数等,并把解析到的内容存入一个类似仓库的地方,在这个阶段所有的变量,在正式运行代码之前,都会提前赋值为未定义。
  4. 预解析过程中如果函数和变量重名的话只会保留函数。
    5.表达式可以修改预解析的值。

三、预解析

  1. 预解析:在当前作用域下,js运行之前,会把带有var和function关键字的事先声明,并在内存中安排好,然后再从上到下执行js语句,预解析只会发生在通过var定义的变量和function上。
    2.只要是通过var定义的,不管是变量,还是函数,都是先赋值undefined,如果是变量,也不管变量有没有赋值,在预解析阶段,都是会被赋值为undefined。
  2. function进行预解析的时候,不仅是声明而且还定义(define)了,但是它存储的数据的那个空间里面存储的是代码是字符串,没有任何意义。
    4.函数在预解释的时候,它把它分解成两部分来对待,第一部分是fn函数,而第二部分是(),一个匿名函数,执行时会报错。如果小括号带参数,虽然不会报错,会打印出来,但并不能把fn执行,也不能当成参数传递给fn函数。
    5.预解析是发生在当前作用域下的,不会在同一个变量上重复的发生,也就是一个变量如果已经在当前作用域下预解析了,不会再重复解析。
  3. 预解析的过程:
    第一步,会预先根据关键字var、function等,来查找一些需要被解析的东西。
    第二步,给这些需要被解析的东西提前赋值,所有的变量,提前赋值:undefined;所有的函数,在正式运行代码前,都赋值为整个函数块。
    第三步,“预解析”结束后,浏览器再逐行解读代码,并通过表达式:= + - * – ++ !等来修改这些“预解析”的值。

六、解析原则:

  1. 预解析规则:JavaScript “预解析”过程中,遇到重名的内容,只保留一个。重名变量或重名函数,保留最后的一个; 变量和函数重名,只保留函数。
  2. 根据作用域链,来查找上文第一步中提到的需要被解析的东西,查找原则:从上到下,从里到外,即先找局部作用域里找,然后子对象会一级一级向上寻找所有父对象的变量。

七、预解析在不同的ES

  1. 在ES5中,只存在全局和函数级作用域,在ES6中,引入了块级作用域。
  2. js的预解析机制大概分为两个过程:预解析和自上而下逐行解读。
  3. 预解析:js解析器会先把var定义的变量、function、参数等一些东西存储进仓库里面(内存),变量var在正式运行之前,都赋值为undefined,function函数在运行之前,就是整个函数块。
  4. 逐行解读:表达式=、+、-、*、/、++、–、!、%…number()、参数都可以赋值。
    5.遇到重名的,只留下一个,变量和函数重名,函数优先级高于变量,只留下函数。
  5. 函数调用(函数是一个作用域,遇到作用域都会按照先进行预解析,然后逐行解读的过程执行),先局部找参数,局部找不到就自下向上找(作用域链)。
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值