全局变量:在函数以外用var声明的变量在全局都可以数用,就是全局变量(如果页面不关闭,那么就不会释放,就会占内存,消耗内存)
局部变量:在函数内部定义的变量是局部变量,只能在函数内部使用,外部不能使用(*当函数调用完毕,局部变量就释放了);
全局作用域:全局变量使用的范围
作用域链:
var num = 10;
function f1(num){
var num = 20;
function f2(){
var num = 30;
console.log(num);
function f3(){
var num = 40;
}
f3();
}
f2();
}
console.log(f1(10))
//结果为40
//如果f3中没有num就会到f2中去寻找num,找到后打印f2中的值,如果没有到f1中寻找num,如果有打印f1的num值,如果没有再到全局中寻找num,找到打印num的值,作用域链的形成与函数定义阶段和函数在哪里执行怎么执行,与关系。
预解析
在解析代码之前,把变量的声明和函数的声明提前到当前所在的作用域的最上面,执行期上下文,找形参和变量声明 将变量和形参作为AO的属性名 值为undefined,将实参和形参统一,在函数里面找函数声明,值赋予函数体,函数执行完毕。
f1();
function f1(){
console.log(“函数的预解析”);
}
上面的代码把函数提前声明了,所以f1调用的时候不会报错
//案例1:
f1();
function f1(){
console.log(num);
var num = 10;
}
上面的代码相当于:
function f1(){
var num;//undefined,因为只定义了还没赋值就调用了,所以结果是undefined,如果没有预解析,就会报错
console.log(num);
num = 10;
}
f1();
案例2:
function fn(a,b){
console.log(a)// 打印 fn(a){ }
console.log(b)// 打印 fn n(b){ }
c=50;
var c= function(e){
}
console.log(c); //fn
a=999;
function a(){
}
console.log(a); //999
function b(d){
}
b=333;
console.log(b); //333
}
fn(10,20)