一.作用域
作用域:作用的范围,指的是函数在哪些范围内可以用,而在其他部分就不可以使用,如果需要使用就需要重新定义。也可以理解为程序源代码中定义的这个变量的区域。
作用域的作用:用来执行读或者写的操作。
二、预解析规则
预解析规则: 对于script是自上而下进行解析,对于函数是由里到外进行解析。
浏览器在执行JS代码的时候会分成两部分操作:预解析以及逐行执行代码。
预解析:浏览器在开始工作的时候会先解读JS代码的关键字:比如:var function 参数等,并把解析到的内容存入一个类似仓库的地方,在这个阶段所有的变量,在正式运行代码之前,都会提前赋值为未定义。
预解析过程中如果函数和变量重名的话只会保留函数。
5.表达式可以修改预解析的值。
三、预解析
预解析:在当前作用域下,js运行之前,会把带有var和function关键字的事先声明,并在内存中安排好,然后再从上到下执行js语句,预解析只会发生在通过var定义的变量和function上。
2.只要是通过var定义的,不管是变量,还是函数,都是先赋值undefined,如果是变量,也不管变量有没有赋值,在预解析阶段,都是会被赋值为undefined。
function进行预解析的时候,不仅是声明而且还定义(define)了,但是它存储的数据的那个空间里面存储的是代码是字符串,没有任何意义。
4.函数在预解释的时候,它把它分解成两部分来对待,第一部分是fn函数,而第二部分是(),一个匿名函数,执行时会报错。如果小括号带参数,虽然不会报错,会打印出来,但并不能把fn执行,也不能当成参数传递给fn函数。
5.预解析是发生在当前作用域下的,不会在同一个变量上重复的发生,也就是一个变量如果已经在当前作用域下预解析了,不会再重复解析。
预解析的过程:
第一步,会预先根据关键字var、function等,来查找一些需要被解析的东西。
第二步,给这些需要被解析的东西提前赋值,所有的变量,提前赋值:undefined;所有的函数,在正式运行代码前,都赋值为整个函数块。
第三步,“预解析”结束后,浏览器再逐行解读代码,并通过表达式:= + - * – ++ !等来修改这些“预解析”的值。
六、解析原则:
预解析规则:JavaScript “预解析”过程中,遇到重名的内容,只保留一个。重名变量或重名函数,保留最后的一个; 变量和函数重名,只保留函数。
根据作用域链,来查找上文第一步中提到的需要被解析的东西,查找原则:从上到下,从里到外,即先找局部作用域里找,然后子对象会一级一级向上寻找所有父对象的变量。
七、预解析在不同的ES
在ES5中,只存在全局和函数级作用域,在ES6中,引入了块级作用域。
js的预解析机制大概分为两个过程:预解析和自上而下逐行解读。
预解析:js解析器会先把var定义的变量、function、参数等一些东西存储进仓库里面(内存),变量var在正式运行之前,都赋值为undefined,function函数在运行之前,就是整个函数块。
逐行解读:表达式=、+、-、*、/、++、–、!、%…number()、参数都可以赋值。
5.遇到重名的,只留下一个,变量和函数重名,函数优先级高于变量,只留下函数。
函数调用(函数是一个作用域,遇到作用域都会按照先进行预解析,然后逐行解读的过程执行),先局部找参数,局部找不到就自下向上找(作用域链)。