
ES5和ES6作用域
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<title>ES5和ES6的区别</title>
</head> <body>
<script type="text/javascript">
//ES5 中作用域,
const callbacks = []
//i是通过var定义的 是全局变量
for (var i = 0; i <= 2; i++) {
//闭包的作用域是全局
callbacks[i] = function() {
return i * 2 //callbacks中的return i*2,是对变量的引用,而不是对函数变量值的引用。函数体中是一个变量,而不是一个值
}
}
console.table([
callbacks[0](), //6,for循环执行完毕,i=3,调用callback的时候 i=3
callbacks[1](), //6
callbacks[2](), //6
]);
console.log([
callbacks[0](),
callbacks[1](),
callbacks[2](),
]); //ES6 作用域
const callbacks2 = []
//用let声明的变量有块作用域的概念
for (let j = 0; j <= 2; j++) {
callbacks2[j] = function() {
return j * 2 //闭包取决于当前的块作用域,每循环一次,它就重新生成新的作用域
}
}
console.table([
callbacks2[0](), //0
callbacks2[1](), //2
callbacks2[2](), //4
]); //ES5 es5中要执行立即执行函数((function(){},()),才能对作用域进行隔离。
((function() {
const foo = function() {
return 1;
}
console.log("foo === 1", foo() === 1);
((function() {
const foo = function() {
return 2;
}
console.log("foo === 2", foo() === 2);
})())
console.log("foo === 1", foo() === 1);
})())
//ES6 es6:{}表示一个新的作用域,{}可以对作用域进行隔离。
{
function foo() {
return 1;
}
console.log("foo === 1", foo() === 1); {
function foo() {
return 2;
}
}
console.log("foo === 2", foo() === 2); } //ES3,ES5写法
var evens = [1, 2, 3, 4, 5];
var odds = evens.map(function(v) { //遍历
return v + 1
});
console.log(evens, odds)
//ES6箭头函数
{
let evens = [1, 2, 3, 4, 5];
let odds = evens.map(v => v + 1);
console.log(evens, odds)
}
/*
*箭头函数与普通函数的区别,在于this的绑定 */
//ES3,ES5,this指向是该函数被调用的对象
{
var factory = function() {
this.a = 'a';
this.b = 'b';
this.c = {
a: 'a+',
b: function() {
return this.a
}
}
}
console.log(new factory().c.b()); //a+
}
//ES6 this指向定义时的this
{
var factory = function() {
this.a = 'a';
this.b = 'b';
this.c = {
a: 'a+',
b: () => {
return this.a
}
}
}
console.log(new factory().c.b()); //a
}
/*
**默认参数
*/
{
//ES3,ES5默认参数写法
function f(x, y, z) {
if (y === undefined) {
y = 7;
}
if (z === undefined) {
z = 42;
}
return x + y + z; }
console.log(f(1)); //50
console.log(f(1, 3)); //46
} {
//ES6 默认参数写法
function f(x, y = 7, z = 42) {
return x + y + z;
}
console.log(f(1)); //50
console.log(f(1, 3)); //46
} {
//es6 检查X默认参数是否赋值了
//先声明一个函数
function checkParameter() {
// throw new Error阻止js运行
throw new Error('can\'t be empty')
} function f(x = checkParameter(), y = 7, z = 42) {
return x + y + z;
}
console.log(f(2));
try {
f();
} catch (e) {
console.log(e)
} finally {}
} {
// ES3,ES5 可变参数
function f() {
var a = Array.prototype.slice.call(arguments); //伪数组,获取当前的参数列表
var sum = 0; //初始值
a.forEach(function(item) {
sum += item * 1; //求和运算
})
return sum;
}
console.log(f(1, 2, 3))
} {
//ES6 可变参数写法
//...a代表扩展运算符,可变参数的列表
function f(...a) {
var sum = 0;
a.forEach(item => {
sum += item * 1; //求和运算
})
return sum; }
console.log(f(1, 2, 3))
}
/*
**合并数组
*/
{
//es5 合并数组
var params = ['hi','true',7];
var other = [1,2].concat(params);
console.log(other)
}
{
//es6 利用扩展运算符合并数组写法
var params = ['hi','true',7];
var other = [1,2,...params];
console.log(other)
}
</script>
</body> </html>
效果图: