预解释的基础知识
例子
1234567console.log(d);//-->function d(){};d=1;//-->d=1s=d;//-->s=1function d(){//-->xxxfff000}d();//-->d is not a function1.预解释:
是一个过程,作用域形成之后,代码执行之前,把所有带var关键字和function提前声明或定义
2.作用域:
- 1). 全局作用域:window下,一打开浏览器就会形成
2). 私有作用域:一个函数就是一个私有作用域,函数一执行就会形成私有作用域
3.声明:
告诉浏览器这里有个变量,var关键字的只有声明
4.定义:
赋值过程,在预解释的时候function即声明还定义
5.注意:
- 预解释的时候遇到变量已经声明过了就不用声明了,但是需要重新定义,例如:1234567891011//变量只声明未定义就是undefinedconsole.log(obj1);//-->undefinedvar obj1={name:"111"};console.log(fn);function fn() {}//1.全局作用形成//2.全局作用域下的预解释:var obj1,function fn=xxxfff000//3.代码执行:// 1.console.log(obj1);-->undefined// 2.obj1=xxxfff111// 3. console.log(fn);-->function fn() {}
预解释的几种特殊情况
- 注意:
- 全局作用域下的变量就是window的一个属性
1.=右边函数不进行预解释(函数作为值的时候\绑定事件的时候 不进行预解释)
|
|
2.return 后面的代码不行行但是需要预解释,return出的内容执行但是不进行预解释
|
|
3.在条件语句中
1)不管条件是否成立都进行预解释
1234567console.log(num);if (0){//虽然条件不成立 但是需要预解释var num=0}ss=0;//->window.ss=0console.log("ss" in window);2)条件中有函数function
在条件中的var和function只声明不定义,声明的时候当遇到变量已经被声明了,就会报错
1234if('a' in window){var a=1;function(){};//-->'a' has already been declared}条件一旦成立,首先给函数赋值
123456789101112console.log(a);if ("a" in window){console.log(a);a=1;function a() {}console.log(a);}//预解释:function a -->就相当于给window增加一个“a”属性//"a" in window 就是true//条件成立第一步先给function a赋值=xxxfff000//代码执行:console.log(a);xxxfff000->function a() {}// a=1,重新给a赋值
4.自执行函数 不进行预解释
|
|
5.函数作为参数的时候不进行预解释
|
|
6.预解释的时候遇到已经声明过得变量不需要声明了,但是需要定义
|
|