问题:变量提升和函数声明提升是如何产生的??
a.变量提升与函数提升产生的原因:变量提升与函数提升就是执行上下文预处理的效果。 b.进行执行上下文预处理后,就按顺序进行执行;如果在执行有有函数,则再次进行函数的预处理。 c.执行上下文环境(对象)是动态的,调用函数时创建,函数调用结束时上下文环境(对象)就会被自动释放;(局部变量自动释放)
<script type="text/javascript"> //全局执行上下文 console.log(e); //undefined console.log(window.e); //预处理会将e添加为window的属性,所以e和window.e是一样的。 //this表示的是window; var e=12; function fun(){ console.log("fun()"); } //函数执行上下文 function fn(a1){ console.log(a1); //2 console.log(a2); //undefined a3(); //a3() console.log(this); //window console.log(arguments); //2,3 伪数组 var a2=3; function a3(){ console.log('a3()'); } } fn(2,3); //函数执行上下文对象,在调用函数时产生; </script>栈结构:后产生的执行上下文对象,一定是先执行。
<script type="text/javascript"> console.log("gb:"+i); var i=1; foo(1); //产生执行上下文, function foo(i){ if(i==4){ return } console.log("fb:"+i); //执行三次i=1,i=2,i=3 foo(i+1); //递归调用,在函数内部调用自己; console.log("fe:"+i); //递归调用三次,执行三次i=3,i=2,i=1 } console.log("ge:"+i); </script> 1.依次输出什么? gb:undefined fb:1 fb:2 fb:3 fe:3 fe:2 fe: 1 ge: 1 2.整个过程中产生了几个执行上下文? 产生5次;1+1+3 var c=1; function c(c){ console.log(c); } c(2); //结果为报错; //原因:先变量c提升了,然后后执行c=1 //执行c=1后,此时c就是一个变量了,调用c(2)则会报错; //函数还没调用,则函数里面的代码并未执行;