一、定义
JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的。JavaScript解析器执行JavaScript代码的时候,分为两个过程:预解析过程和代码执行过程
function 声明的函数会预解析到顶部,而赋值式的创建函数是先解析这个变量到顶部,然后程序在执行时到该赋值函数时才会知道这个是赋值式函数,
a();//由于变量的预解析,不知道a是一个变量还是一个函数,所以输出a is not function
var a = function(){
console.log(1);
};
a();//执行成功,输出1
而变量预解析是先解析变量,待代码执行到赋值时才会进行赋值
console.log(a);//变量的预解析,所以打印undefined
var a = 10;
console.log(a);//由于上面已经赋值,所以打印10
作用域
全局作用域和局部作用域
全局作用域:范围整个页面,只有当前页面关闭时,全局作用域才会失效
局部作用域:全局作用域中又划分出的小范围的作用域,函数内部可以创建局部作用域,到目前为止,也只有函数内部可以创建局部变量
当定义了一个全局a变量,而函数的局部作用域中也声明了a变量 如果在函数作用域中输出一下a 这个a输出的会是作用域中a的值,就近原则。
当局部作用域中没有使用var定义 但是却有赋值,当你在外部调用这个函数,在全局中来进行使用这个变量时,他会把这个变量自动转换成全局变量