函数参数列表的行为

arguments 对象在严格非严格模式下表现不同。在非严格模式下,argument 对象将反映存在的参数值的变化,但是在严格模式下,对参数值的任何更改都不会反映在 argument 对象中。

function add(a, b){
    console.log(arguments[0], arguments[1]); // Prints : 1,2

    a = 5, b = 10;

    console.log(arguments[0], arguments[1]); // Prints : 5,10
}

add(1, 2);

对于上面的代码,当我们更改参数的值时,arguments 对象会被更改。但是,对于严格模式,同样不会反映出来。

function add(a, b) {
    'use strict';

    console.log(arguments[0], arguments[1]); // Prints : 1,2

    a = 5, b = 10;

    console.log(arguments[0], arguments[1]); // Prints : 1,2
}

值得一提的是,如果参数中的任何一个 undefined,我们试图改变参数的两个值严格模式或者非严格模式 arguments 对象保持不变。

严格的模式

function add(a, b) {
    'use strict';

    console.log(arguments[0], arguments[1]); // undefined,undefined 
                                             // 1,undefined
    a = 5, b = 10;

    console.log(arguments[0], arguments[1]); // undefined,undefined
                                             // 1, undefined
}
add();
// undefined,undefined 
// undefined,undefined

add(1)
// 1, undefined
// 1, undefined

非严格模式

function add(a,b) {

    console.log(arguments[0],arguments[1]);

    a = 5, b = 10;

    console.log(arguments[0],arguments[1]);
}
add();
// undefined,undefined 
// undefined,undefined

add(1);
// 1, undefined
// 5, undefined