全局变量:在函数以外用var声明的变量在全局都可以使用,就是全局 变量.
*如果页面不关闭,那么就不会释放,就会占内存,消耗内存
局部变量:在函数内部定义的变量是局部变量,只能在函数内部使用,外部不能使用
*当函数调用完毕,局部变量就释放了
全局作用域:全局变量使用的范围
局部作用域 :局部变量的使用范围
隐式全局变量:变量声明没有var,就叫隐式全局变量
function f1(){
number = 100;//是隐式全局变量
}
f1();
console.log(number);//此时打印的结果是100
*注意:全部变量是不能被删除的,但是隐式全局变量是能被删除的
var num1 = 1;
num2 = 2;
delete num1;
delete num2;
console.log(num1);//number
console.log(num1+2);//3
console.log(num2);//undefined作用域链
var num = 10;
function f1(){
var num = 20;
function f2(){
var num = 30;
function f3(){
var num = 40;
console.log(num);
}
f3();
}
f2();
}
f1();//结果为40
**如果f3中没有num就会到f2中去寻找num,找到后打印f2中的值,如果没有到f1中寻找num,如果有打印f1的num值,如果没有再到全局中寻找num,找到打印num的值,如果在找不到,就报错
预解析
在解析代码之前,把变量的声明和函数的声明提前到当前所在的作用域的最上面
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:
f1();//此函数调用的结果是undefined
var num = 20;
function f1(){
console.log(num);
var num = 10;
}
//上面函数代码就相当于
var num = 20;
function f1(){
var num ;
console.log(num);//在函数内部找到num后就不会出函数再去找
num = 10;
}
案例3:
var a;
a = 18;
f1();
function f1(){
var b = 9;
console.log(a);//udefined
console.log(b);//9
var a = '123';
}案例4:
f1();
console.log(c);//9
console.log(b);//9
console.log(a);//报错
function f1(){
var a = b = c = 9;
console.log(c);//9
console.log(b);//9
console.log(a);//9
}
//以上代码就相当于:
function f1(){
var a;
a = 9; //局部变量
b = 9; //隐式全局变量
c = 9; //隐式全局变量
console.log(c);//9
console.log(b);//9
console.log(a);//9
}
f1();
console.log(c);//9
console.log(b);//9
console.log(a);//报错 函数声明预解析:
f1(); //报错
var f1 = function (){
console.log(a);
var a = 10;
}
解释:因为在调用的时候只声明了一个变量,并没有说明是不是一个函数,直接函数调用就报错了。
var f1;
f1();
f1 = function(){
var a ;
console.log(a);
a = 10;
}
本文深入探讨JavaScript中的全局变量、局部变量及隐式全局变量的概念与使用方式,通过实例讲解作用域链、预解析等核心机制。
1053

被折叠的 条评论
为什么被折叠?



