2、预解释(变量提声)
一、为什么要学习预解释
1.带var和不带var的区别
2.明白obj[i]的i会报错
3.带var和不带var程序都能正常执行
4.规范代码,明白报错原因
二、认识预解释
1.浏览器自带机制
2.当浏览器加载html时,首先会提供一个供全局js执行的环境--全局作用域(window)。
三、预解释原理
在当前作用域下,js代码执行之前,浏览器会对带var和function的进行提前声明或定义。
1.声明(declare)--告诉浏览器在当前作用域下有这个东西了
定义(defined)--给函数fun定义
2.对于带var和带function的预解释机制是不一样的:
带var的知识提前声明不定义,默认值是undefined
带function的声明加定义都完成。
3.预解释只发生在当前作用域中,最开始只对window下进行预解释,若在某个函数里面带var和带fun的,只有当函数执行的时候,才会与解释。
/* var n=9; var s="str"; function fn(){ alert(n); alert(s); n=7; var n=6; alert(n); } fn();*/ /* var oBtn=document.getElementsByTagName("input"); for(var i=0;i<oBtn.length;i++){ oBtn[i].onclick=function(){ for(var j=0;j<oBtn.length;j++) { oBtn[j].style.background="red"; } } } */ /* alert(a); var a=3; // alert(a); function fn(a){ alert(a); a=1; alert(a); } // m=1; // alert(m) fn(); fn(a)*/ /*f=function(){return true}; g=function(){return false}; (function(){ if(g()&&[]==![]){//会对函数g进行预解释,所以函数内g() 函数执行会返回结果true; f=function(){return false}; function g(){return true}; } })(); console.log(f()); console.log(g());*/ // 对函数g()进行预解释后,函数执行放在函数定义前面也会执行。 /* var name="dalyn"; var age="500"; name=(function(name,age){ name="DALYN" ; age= age||this.age; console.log(name,age) })(name) console.log(name,age) //函数没有返回值 所以是undefined */ // 注意运算符的优先级 /*var i=3; function fn(){ i*2; return function(n){ console.log(n*(++i)) } } var f=fn(); f(3); fn()(3); f(4); fn()(4);*/ function fn(){ var i=10; return function(n){ console.log(n+(++i)) } } var f=fn(); f(15); f(20);//不销毁 函数中return的返回值被变量f占据 之后后面小函数执行完毕销毁 fn()(15);//不立即销毁 函数中return的返回值被变量f临时占据,(15)执行完毕后都销毁了。 fn()(20); fn()(30); f(30);