function f(a,b,c){ alert(a);//函数字符串 alert(b); var b = 5; function a(){ } } f(1,2); //预处理 lexicalEnvironme{//这里的词法环境对象不是window,而是每个函数自己创建的,我们在外部没法访问 a:指向函数的引用;//因为函数覆盖了变量 b:2;//传入的实参 c:undefined;//执行阶段会给预处理成员赋值 arguments:实际出入参数; } function f1(){ funct…
先看下面实例的执行结果: alert(a);//undefined alert(b);//报错 alert(f);//输出f函数字符串 alert(g);//undefined var a = 1; var b = 2; alert(b); function f(){ console.log('ff'); } var g = function { console.log('gg'); } alert(g);//输出g函数字符串 为什么出现这种情况,就要明白js解析和执行过程 js解析与执行过程:…
JS的解析与执行过程 全局中的解析和执行过程 预处理:创建一个词法环境(LexicalEnvironment,在后面简写为LE),扫描JS中的用声明的方式声明的函数,用var定义的变量并将它们加到预处理阶段的词法环境中去. 一.全局环境中如何理解预处理 比如说下面的这段代码: ;//用var定义的变量,以赋值 var b;//用var定义的变量,未赋值 c = ;//未定义,直接赋值 function d(){//用声明的方式声明的函数 console.log('hello'); } var e…
js函数预解析 例子1: 先上一段代码,看看能不能写出最终的执行结果. console.log(a); var a = 1; console.log(a); function a(){ console.log(2); } var a = 3; console.log(a); function a(){ console.log(4); } console.log(a); a(); 运行结果: 解释一下: 首先预解析阶段遇到 var a = 1:声明变量a 然后遇到第一个函数a声明,这时由于和变量a…
问题:有如下代码 var a = 1; function pop() { alert(a); var a = 5; } pop();//执行结果,弹出undefined 这段代码的执行结果为undefined,为什么呢? JS的解析与执行并不是读一行,处理一行,读一行,处理一行这样进行的,而是分为两个阶段: 1.预处理阶段: 2.执行阶段: 然后分别以全局和函数内部的局部代码而言: 1.全局预处理 在解析JS代码的时候,首先会创建一个全局LexicalEnviroment{ }(词法环境)对象…
有如下代码: <body> <script> alert(f); function f() { console.log("fff"); } var f = 5; </script> </body> 不论var f 与function f 的先后顺序如何,该代码执行的结果总是弹出function f 的字符串,为什么呢?像这种函数与变量命名冲突时JS的处理原则又是什么? 在扫描函数声明与变量声明的时候,是先扫描函数声明(function f…