3.1 语法
- ECMAScript中的一切都区分大小写
- 标识符命名规则
- 第一个字符必须时字母、下划线(_)或美元符号($)
- 剩下的其他字符可以是字母、下划线(_)、美元符号($) 或数字
- 一般使用驼峰大小写形式
. 3. 对整个脚本启用严格模式,在脚本开头加上这一行:
"use strict"
也可以单独指定一个函数在严格模式下执行,把预处理指令放到函数体开头:
function doSomething(){
"use strict"
//函数体
}
4.每条语句以分号结尾,便于开发者通过删除空行来压缩代码(如果没有结尾的分号,删除空行,则会导致语法错误)
3.2 关键字和变量
在javascript中有三个变量可以申明变量:var、const、let。 其中var在所有版本中可用,而const和let只能在ECMAScript6以及之后的版本中出现。
3.1.1.var 声明作用域
1. 局部变量,在函数内部定义一个变量,变量在函数退出来时被销毁。
function test(){
var message="hi";//局部变量
};
test();
console.log(message);//报错,此变量未被申明
在函数内定义变量,省略var 操作符可以创建一个全局变量
function test(){
message="hi";//局部变量
};
test();
console.log(message);//hi
定义多个变量,可以在一条语句中用逗号分隔每个变量。
var meaasge="come on",
found=true,
age=29;
2.var声明提升
function foo(){
console.log(age);
var age=26;
}
foo(); //undefined
相当于:
function foo(){
var age;
console.log(age);
age=26;
}
foo(); //undefined
使用var反复声明同一个变量也没有问题。
function foo(){
var age=1;
var age=2;
var age=23;
console.log(age);
}
foo(); //23
3.1.2 let 声明
let 与var 区别在于 let 声明的作用域是块作用域,而var声明的作用域是函数作用域。
//申明的 var name 没有在函数范围内,因此 if 块外面也可以使用
if (true){
var name="matte";
console.log(name);
}
console.log(name); //matte
//声明的 let name 在if 块内部,因此在外部不能使用name
if (true){
let name="matte";
console.log(name);
}
console.log(name); //没有定义age
块作用域是函数作用域的子集,因此适用于var 的作用域限制同样也使用于let.
使用let 声明变量时,在同一个块作用域中不能同时申明一个变量。但是在嵌套中使用相同的标识符不会报错。
let age;
let age;//报错
var name="nike";
console.log(name); //nike
if(true){
var name="matte";
console.log(name);//matte
}
let age=30;
console.log(age);//30
if(true){
var age=26;
console.log(age);//26
}
对声明冗余报错,不会因混用let 和var 而影响。
var name;
let name;//报错
let age;
var age;//报错
暂时性死区:let和var的另外一个重要区别在于let声明的变量不会在作用域中被提升。
console.log(name);
let name="jiayou";//报错
全局声明:使用let 在全局作用域中声明的变量不会成为window对象属性。
var name="matte";
console.log(window.name);
let age=26;
console.log(window.age);//undefined
for循环中的let声明
for(var i=0;i<5;i++){
//循环逻辑
}
console.log(i);//5
for(let i=0;i<5;i++){
//循环逻辑
}
console.log(i);//报错 因为let是块作用域
for(var i=0;i<5;i++){
setTimeout(()=>console.log(i),0);
}
//输出结果是 5,5,5,5,5,之所以这样,是因为在退出循环时,迭代变量保存的是导致循环退出的值,在之后执行超时逻辑时,所有i都时同一个变量,因而输出的都是同一个值。
for(let i=0;i<5;i++){
setTimeout(()=>console.log(i),0);
}
//输出结果是 0,1,2,3,4,JavaScript引擎在后台会为每个迭代循环声明一个新的迭代变量,每个setTimeout引用的都是不同的变量实例。
3.1.3 const声明
const与let 一个重要的区别是它声明变量时必须同时初始化变量,且尝试修改const声明的变量会导致运行时错误。如果const变量引用的是一个对象,南无修改这个对象内部对的属性并不违反const的限制。
总结
- var和let 的区别:var声明的作用域是函数作用域,而let 声明的作用域是块作用域。let声明的变量不会在作用域中被提升。使用let 在全局作用域中声明的变量不会成为window对象属性。let 不能重复声明一个标识符。
- let 与const的区别:const声明变量时必须同时初始化变量,且尝试修改const声明的变量会导致运行时错误。