作用域
html在执行的时候,首先会提供一个供全局JS代码执行的环境
预解释
在当前的作用域中,JS代码执行之前,浏览器会默认的吧 var 和function 进行提前的声明或定义
-
理解声明和定义
声明(declare):var num; ->告诉浏览器在全局作用域有一个num的变量,如果变量只声明未定义,变量值为undefined
定义(defined): num=12; -> 给变量进行赋值 -
var和function的预解释
var: ->预解释的时候只是提前声明
function: -> 声明和定义 -
预解释只发生在当前的作用域下:例如:开始只对window进行预解释,函数只有在执行的时候才进行预解释
函数执行过程
1、形成一个新的作用域(栈内存)
2、如果有形参,先给形参赋值
3、进行私有作用域中的预解释
4、代码从上到下执行
…
预解释是毫无节操的一种机制
- 1、预解释不管判断条件是否成立,都会把所有var提前声明
// window预解释: var num; => window.num;
if(!('num' in window)){
var num = 12;
}
console.log(num) // =>undefined
- 2、预解释相当于只运行等号左边的代码
//函数以声明的方式定义
fn(); // fn is not a function
var fn = function() {
console.log('ok');
}
- 3、自执行函数定义的function 不在全局进行预解释
// 自执行函数:定义和执行一起完成了
(function (num) {console.log(100)})(100)
- 4、函数体中,return下边的代码同样会进行预解释; return后面的代码,不进行预解释
function fn() {
console.log(num);
return function(){};
var num = 100;
}
- 5、预解释时,如果名字已经声明过了,不需要重新声明,但是需要重新赋值
js中 变量名和函数名字一样,也算冲突
//预解释:
/* var fn; => window.fn;
* fn = xxxfff000
* window.fn = xxxfff000;
*/
function fn(){
console.log('ok');
}
练习:
fn(); // 2
function fn() {console.log(1)};
fn(); // 2
var fn = 10; // fn =10
fn(); // fn is not a function
function fn() {console.log(2)};
fn()