先看下面实例的执行结果: 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
问题:有如下代码 var a = 1; function pop() { alert(a); var a = 5; } pop();//执行结果,弹出undefined 这段代码的执行结果为undefined,为什么呢? JS的解析与执行并不是读一行,处理一行,读一行,处理一行这样进行的,而是分为两个阶段: 1.预处理阶段: 2.执行阶段: 然后分别以全局和函数内部的局部代码而言: 1.全局预处理 在解析JS代码的时候,首先会创建一个全局LexicalEnviroment{ }(词法环境)对象
javascript的加载方式,总得来说是在页面上使用script来声明,以及动态的加载这些方式,而动态的加载,在很多js库中都能够很好的去处 理,从而不至于阻塞其他资源的加载,并与其并行加载下来.这样的动态异步的加载方式罗列起来有:Ajax的方式.DOM Element Insert.Iframe.document.write.defer等等.这些都能够很好的处理js在加载的时候不会阻塞资源加载的问题,但是,js 的执行仍然会阻塞浏览器的渲染.或许这是不得不需要付出的代价,有没有一些方式去缓解
有如下代码: <body> <script> alert(f); function f() { console.log("fff"); } var f = 5; </script> </body> 不论var f 与function f 的先后顺序如何,该代码执行的结果总是弹出function f 的字符串,为什么呢?像这种函数与变量命名冲突时JS的处理原则又是什么? 在扫描函数声明与变量声明的时候,是先扫描函数声明(function f
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