文章目录
JavaScript的语法规则很大程度上借鉴了C语言和其他类C语言,如Java和Perl。熟悉这些开发语言的就很容易理解,JavaScript宽松的语法。
3.1 变量
3.1.1 var关键字
- 在JavaScript(ECMAScript)中,使用
关键字 变量名 = 初始值
这种形式来定义并初始化一个变量。注意定义变量和变量初始化是两步!
var msg; // 定义一个变量msg 此时msg=undefined
msg = "hello" // 给msg赋值位字符串hello
var的作用域
“作用域”是指变量起作用的范围。按照范围可以分为“全局变量”以及“局部变量”
- 全局变量
var a = 10; // 在函数外定义(可以没有初始值)的变量是全局变量
function fun(){
a = a + 5; // 在函数内部可以访问到外部的变量
}
console.log(a); // a = 15 并且可以修改该变量的值
- 局部变量
function fun (){
var a = 10; // 在函数内部定义了一个变量
console.log(a); // a = 10 在同一个作用域下可以访问
}
fun();
console.log(a); // ERROR: a is not defined
// 外部作用域不可以访问到内部作用域的变量;也可以这么说当函数执行结束之后函数内部定义的变量都会被清除
虽然可以通过省略var关键字定义全局变量,但是不推荐这么做。尤其是在局部作用域中定义了一个全局变量,这样一个是不好维护,另一个也会造成一定的困惑。在严格模式下不使用关键字定义变量,则会导致抛出ReferenceError
var的变量提升
var 关键字定义的变量有一个特殊的情况,js加载的时候会默认把var定义的变量提升到它所在作用域的最上面
function foo(){
console.log(arg);
var arg = 100;
}
foo(); // undefined
上面这段代码之所以不报错就是因为“var的变量提升”,使得等价于下面这段代码:
function foo(){
var arg;
console.log(arg);
arg = 100;
}
foo();
3.1.2 let 声明
let跟var声明的作用差不多,但是有着一个非常重要的区别。
let声明的变量是“块级作用域”,而var声明的“函数作用域”
// var定义变量
function foo(){
if(true){
var name = 'neek';
console.log(name); // neek
}
console.log(name); // neek
}
foo();
// let定义变量
function fun(){
if(true){
let name = "tom";
console.log(name); // tom
}
console.log(name); // ReferenceError: name is not defined
}
fun();
let 不允许同一个块级作用域中出现重复声明
var a = "a";
var a = "b";
let b = "b";
let b = "c";// SyntaxError
暂时性死区
由于在用一个块级作用域中,let 定义的同名变量只能存在一个;并且由于let没有“变量提升”,因此就会出现暂时性死区
console.log(test01); // undefined
var test01 = "test01";
console.log(test02); // ReferenceError: test02 is not defined
let test02 = "test02";
浏览器解析js的使用当执行这个块级作用域的时候会注意到let后面的变量名,并且这个之前不可以存在同名变量,如果存在就会抛出“SyntaxError”的错误
// Uncaught SyntaxError: Identifier 'aa' has already been declared
var aa = "aa";
console.log(aa);
let aa = 10;
为了我的小命和头发,就未完待续吧……