js 代码通过 js 解释器(js 引擎) 来执行的
js 解释器 来执行js 代码分为两步: 首先预解析 再 代码执行
预解析
1、首先把函数声明和变量声明,提升到当前作用域最前面。(原因,是因为JS是一个解释执行的脚本语言,从上到下执行。如果函数调用出现在函数定义之前,就会导致失败。)
带来的问题:
函数定义的提升没有太大影响
变量定义的提升,是有影响的
先把变量定义提升到最前面,然后按顺序执行代码,会出现变量赋值之前就对变量进行了操作的情况。违背了一个原则变量在第一次使用之前应该完成声明和初始化!!ES6中解决了这个问题。
2、变量提升的是声明并不赋值, 函数 只提升声明 并不调用
执行代码
按照从上到下的顺序执行
//案例1
var num1;
console.log(num1);//undefined
//案例2
console.log(num2);//undefined
var num2=10;
//案例3
console.log(num3);//报错 num3 is not defined
// 相当于执行了以下代码
var num2;
console.log(num2);
num2=20;
//案例4
fn(); //1
function fn(){
console.log(1);
}
//案例5
fun(); // 报错 fun is not a function
var fun=function(){
console.log(2);
}
// 相当于执行了以下代码
var fun;
fun();
fun=function(){
console.log(2);
}
//案例6
var fun=function(){
console.log(2);
}
fun(); //2
// 相当于执行了以下代码
var fun;
fun=function(){
console.log(2);
}
fun();
//案例7
f1();
console.log(c);
console.log(b);
console.log(a);
function f1(){
var a=b=c=9;
console.log(a);
console.log(b);
console.log(c);
}
//相当于执行了以下代码
function f1(){
//var a=9; //局部变量 外面不能使用
//b=9; // 函数内部未声明 直接赋值使用的全局变量
//c=9; // 函数内部未声明 直接赋值使用的全局变量
var a=b=c=9;
console.log(a);
console.log(b);
console.log(c);
}
f1();
console.log(c);
console.log(b);
console.log(a);
函数名与变量名冲突:
console.log(a);
var a = 1;
console.log(a);
function a() {
return false;
}
//相当于执行了以下代码
var a;
function a() {
return false;
}
console.log(a);//函数在js里属于一级公民 如果变量名和函数冲突,则会有优先执行 函数
a=1;
console.log(a); // 就近原则 1