一般来讲,一段程序代码中所用到的名字并不老是有效和可用的,而限定这个 名字(变量)的可用性的代码范围就是这个名字的做用域,做用域的使用提升了程序逻辑的局部性,加强了程序的可靠性,减小了名字冲突es6
var num = 10 ;(这一个标签是写在全局做用域里面 这个变量名是可用的 称之为全局做用域)
var num = 10 //局部做用域 function fn(){ //局部做用域 var num = 20 ; //局部下的num和全局下的num是不冲突的由于输出的不同 console.log(num) //20 } fn() //切记调用 console.log(num) // 10
var num=10; console.log(num);//能够打印 10 function fn(){ //函数 console.log(num)//也是能够打印的 10 } fn() console.log(aru) //4.aru is not defined 不能使用
function fun(aru){ var num = 10; //1.num就是局部变量 特色就是只能在函数内部使用 num = 20; //3 . 若是在函数内部,没有声明(不适用var)直接赋值的变量也属于全局变量 } fun(); console.log(num); //2.num is not defined 报错 因此说外部是不能使用的 console.log(num); //3. 20 若是在函数内部,没有声明直接赋值的变量也属于全局变量
2.3.区别:从执行效率来看全局变量和局部变量
(1)全局变量在任何一个地方均可以使用,只有浏览器关闭的时候才会销毁,比较占内存资源
(2)局部变量 当咱们程序执行完毕就会销毁,比较节约内存资源浏览器
var num = 10; //全局做用域函数
var num = 10; function fun(){ //外部函数 var num = 20; function fn(){//3.3.在fun函数里面有生成了一个fn函数 做用域里面诞生了一个新的做用域 内部函数 console.log(num);//3.4.执行是20仍是10呢 20 用链式查找决定 它会往上一级找有没有num 一层一层的找就是链式查找 } fn() } fun()
function f1(){ //1 能够称为0级链 var num = 123; //2 能够称为1级链 function f2(){ //2 能够称为1级链 console.log(num); //3 能够称为2级链 123 } f2() } var num = 456; //1 能够称为0级链 f1();
var a = 1; function fn1(){ var a = 2; var b = '22'; fn2(); function fn2(){ var a = 3; fn3(); function fn3(){ var a = 4; console.log(a); //4 console.log(b); //22 } } } fn1();
console.log(num) //num is not defined
console.log(num) //undefined 坑1 var num = 10; ~ //至关于执行了如下代码 var num; console.log(num); //只声明不赋值 因此输出就是 undefined num = 10;
function fn(){ console.log(11) //11 } fn();
//fun() //若是放到上面调用呢 undefined 坑2 var fun = function(){ console.log(22) //22 } fun() ~//至关于执行了如下代码 var fun; //只声明不赋 fun(); //没有这个函数调用确定会报错 因此正确写法是将fun写到后面 fun = function(){ //函数表达式 console.log(22) //22 } fun();