1、let 和 const
不同于var的函数作用域,let和const都是块级作用域,不具有变量提升的特性。
变量提升:var关键字声明的变量,无论声明在
函数体中的何处,都会被是视为声明在函数的最顶部,这样有时容易导致出现一些问题
console.log(a); // undefined
var a = ‘hello‘;
// 上面的代码相当于
var a;
console.log(a);
a = ‘hello‘;
而let和const声明的变量,不具有变量提升的特性
// 测试let
console.log(a); //会抛出异常:变量没有定义 Uncaught ReferenceError: t is not defined
let a = ‘hello‘;
// 测试const
console.log(c); // 会抛出异常:在变量初始化之前不能访问 Uncaught ReferenceError: Cannot access ‘c‘ before initialization
const c = "abc";
const声明的常量不能修改,且必须显示的初始化
// 定义一个常量c1
const c1 = "const";
// 给常量重新赋值
c1 = "const_str"; // Uncaught TypeError: Assignment to constant variable.
// 定义一个常量c2,没有显示进行初始化
const c2;
c2 = "abc" // Uncaught SyntaxError: Missing initializer in const declaration
// 而let和var都不需要显示进行初始化
let e;
e = 1;
console.log(e) // 1
var d;
d = 2;
console.log(d) // 2
注意点:
- let 和 const 关键词声明的变量不具备变量提升(hoisting)特性
- let 和 const 声明只在最靠近的一个块中(花括号内)有效
- const 在声明时必须被显示赋值初始化
- 编程习惯:当使用const声明常量时,请使用大写变量名,如:CAPITAL_CASING
2、箭头函数(Arrow Function)
ES6中,箭头函数是匿名函数的一种简写形式,使用括号包裹参数,紧跟一个箭头符号=>,最后是函数体。
/**
* 箭头函数基本形式:(形参列表) => { 函数体 };
*/
// ES6 之前的写法
var getPrice = function() {
return 4.55;
};
console.log(getPrice());
// ES6 箭头函数的写法
var getPrice= ()=>{return 555};
console.log(getPrice());
箭头函数的简写形式
//*********************************************
// 如果形参列表只有一个参数,可以省略左侧的小括号
var fun = (a) => {
return a;
}
fun(1);
// 简写形式
var fun = a => {
return a;
}
fun(2);
//*********************************************
//*********************************************
// 如果函数体只有一行代码,可以省略右侧的花括号
var fun = (a, b) => {
console.log(a+b);
}
// 简写形式
var fun = (a, b) => console.log(a+b);
//*********************************************
//*********************************************
// 如果函数体内只有一句return语句,可以省略花括号,且不写return关键字
var fun = () => { return 1;}
// 简写形式
var fun = () => 1;
//*********************************************
箭头函数的特性
// 箭头函数内部的this,永远和箭头函数外部的this 保持一致
// 箭头函数不能使用this, 如果要使用对象中的变量,要用对象的名字.属性
// 箭头函数中没有独立的块级作用域,其作用域为其父级作用域
var student={
name:‘alice‘,
age:23,
say:()=>{
// console.log(this.name);
console.log(student.name);
}
}
student.say();