上文我们说过es6其中有一个特点为:内部arguments this由定义时外围最接近一层的非箭头函数的arguments和this决定其值,本文就来证明这个特点。
arguments案例
案例一
let sum = (a, b) => {
console.log(arguments, a, b);
};
sum(1, 2);
如果上述是一个普通的函数,则arguments是[1, 2],a为1,b为2,那么用es6之后的结果呢?
结果报错:
就是说箭头函数直接在全局定义的话,传入的参数也会没有,因为在这个箭头函数外围,并没有非箭头函数,所以arguments就没有。
案例二
function other() {
let sum = (a, b) => {
console.log(arguments, a, b);
};
sum(1, 2);
};
other(9, 10, 11);
结果:
这时候外层包裹了非箭头函数,这时候arguments就是由定义时外围最接近一层的非箭头函数的arguments,所以上述案例的arguments是other函数的arguments。使用案例
当想要在返回函数里使用传进来的参数时
function Curry () {
var arg = arguments;
return function() {
console.log(arg); // 这里arg为外层Curry函数的参数数组,arguments为返回函数的arguments
}
};
Curry('a', 'b')(1, 2)
结果: 可以看到arg为['a', 'b'],arguments为[1, 2]
这时把里层的返回函数变为箭头函数
function Curry () {
// var arg = arguments;
return () => {
console.log(arguments); // 这时的argument就为外层的arguments,即['a','b']
}
};
Curry('a', 'b')(1, 2)
结果:
this案例
this与arguments很相似,都是由定义时外围最接近一层的非箭头函数的值决定其值,只是在全局时有一点不同
案例一
arguments的案例一说明全局下arguments报错不存在,那么this呢?
let sum = () => {
console.log(this);
};
sum();
结果:
此时的this是window,就是说箭头函数在定义时外界没还有一个非箭头函数包裹着他,他内部的this就是window。除了这一点,其他的this和arguments就是一摸一样的啦