Java Script中声明提前有两种情况!
什么是声明提前?
在正式执行程序前,都会先预读所有var声明的变量和function声明的函数,集中到当前作用域的顶部集中声明。 ***赋值留在原地***
这里涉及到作用域的概念:
作用域简单来说就是一个变量的可用范围。
作用域分为两种:
1.全局作用域:专门保存全局变量的对象, 全局变量:在任何时候,任何位置都可被访问
2.函数作用域:专门保存函数内部的局部变量的对象
局部变量:2类:1. 参数变量 2. 在函数内声明的只在函数调用时的函数内部才可使用!
1.var声明提前:
例如:
console.log(a);
var a=100;
console.log(a);
程序执行时,就会变成
var a;
console.log(a);
a=100;
console.log(a);
因此第一个输出就会输出:undefined
第二个输出就会输出100
2.函数声明提前
大家都知道函数创建的方式有三种:
1.声明提前方式创建:
function fun(){};
在程序执行前都会先预读function声明的函数,并把它提到当前作用域顶部,程序执行时自上而下解释执行。
例如:
var a=100;
console.log(a);
console.log(fun());
function fun(){};
在程序执行时就会变成:
var a=100;
function fun(){};
console.log(a);
console.log(fun());
2.函数名直接量创建函数:
var fun=function(){};
这种创建函数的方式只是会把函数名提前到当前作用域顶端,值会留在原地
例如:
var a=100;
console.log(a);
console.log(fun());
var fun=function(){};
在程序执行时就会变成:
var a=100;
var fun;
console.log(a);
console.log(fun());
fun=function(){};
3.使用实例化创建函数
var fun=new Function(){"参数","return"};
这种方式跟函数名直接量一样只会把函数名提前,赋值会留在原地。但是相对于函数名来创建函数来说,实例化创建的函数执行时效率要差一些,因为这种方式要求函数体内的参数和返回值必须用""包裹起来,执行时JS底层会自动将字符串转换为JS语句,这样无形的就增加了运行的时间,效率自然会慢一些。
综上所诉:JS中声明提前的VIP通道只有两种一种是var声明的变量另一种就是function声明的函数
下面我们来看一些具体的案例:
var n=10;
function fun(n){
console.log(m);
var m=n;
n++;
console.log(m);
}
fun(n);
console.log(n);
console.log(m);
var n=10;
function fun(){
n++;
console.log(n);
n=9;
console.log(n);
}
fun();
console.log(n);