ES6学习(六) -- 箭头函数arguments和this

1,000 阅读2分钟

上文我们说过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就是一摸一样的啦