一、全局作用域与函数作用域
在ES6之前,JS只有两个作用域,全局作用域和函数作用域。那么什么是作用域呢?作用域是指一个变量的作用范围。
全局变量:全局变量在 JavaScript 程序的任何地方都可以访问。
局部变量:函数内使用 var 声明的变量只能在函数内访问,如果不使用 var 则是全局变量。
var a = 10;
function fun(){console.log("第二部分:" + a);
}
console.log("第三部分:" + a); //10
fun(); //10
function fun(){var a = 10;console.log("第二部分:" + a);
}
fun();
console.log("第三部分:" + a); //a is not defined
function fun(){a = 10;console.log("第二部分:" + a);
}
fun();
console.log("第三部分:" + a); //10
function fun(){a = 10;console.log("第二部分:" + a);
}
console.log(a); //a is not defined
fun();
console.log("第三部分:" + a);
结论:
(1) 在最外面用var声明的变量是全局变量;
(2)在函数内用var声明的变量是局部变量
(3)不用var声明,直接赋值的变量,是全局变量。
注:a = 10,这种声明方式只有在这条语句执行的时候才会创建全局变量a。
二、JavaScript的块级作用域
使用 var 关键字声明的变量不具备块级作用域的特性,它在 {} 外依然能被访问到。ECMAScript 6(简称ES6)中新增了块级作用域。
块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。
{var a = 10;
}
console.log(a); //输出10
es5中要实现块级作用域,通常借助立即执行匿名函数来实现
(function(){var a = 10;
}());
console.log(a); //a is not defined
使用let和const声明的变量形成块作用域,是局部变量
{let a = 10;
}
console.log(a); //a is not defined
{const b = 10;
}
console.log(b); //b is not defined
使用let与const在最外层声明的变量有全局作用域
let a = 10;
{console.log(a); //10
}
const b = 10;
{console.log(b); //10
}
三、使用var声明变量带来的问题
允许重复的变量声明,导致变量覆盖var a = 10;
console.log(a); //10
{console.log(a); //10var a = 2console.log(a); //2
}
console.log(a); //2
使用let则不会
var x = 10;
console.log(x); // 这里输出 x 为 10
{ let x = 2;console.log(x) // 这里输出 x 为 2
}
console.log(x); // 这里输出 x 为 10
使用var声明的全局变量会挂载到全局对象window上
//使用var声明的全局变量
var a = 100;
console.log(a,window.a); //100 100b = 10;
console.log(b,window.b) //10,10{//var声明的变量没有块级作用域的概念var c = 20;d = 30
}
console.log(c,window.c); //20 20
console.log(d,window.d) //30 30function fun(){//用var声明的函数作用域的变量var e = 50;console.log("haha");
}
console.log(window.fun); //f fun(){...函数内容}
console.log(e,window.e); //
四、var,let,const的区别
var声明的变量会挂载在window上,而let和const声明的变量不会
var声明变量存在变量提升,let和const声明的变量不存在变量提升,不能在声明变量前使用变量。
let和const声明的变量形成块作用域
同一作用域下let和const不能声明同名变量,而var可以
var和const声明的变量存在暂时性死区
var a = 100;
if(1){a = 10;//在当前块作用域中存在a使用let/const声明的情况下,给a赋值10时,只会在当前作用域找变量a,// 而这时,还未到声明时候,所以控制台Error:a is not definedlet a = 1;
}
const一旦声明必须赋值,不能使用null占位;声明后不能再修改 ;如果声明的是复合类型数据,可以修改其属性
五、const与let的区别
const声明的常量必须初始化,而let声明的变量不用const 定义常量的值不能通过再赋值修改,也不能再次声明。而 let 定义的变量值可以修改。更多推荐
var,const
发布评论