1.普通参数
function foo(x){
console.log(x);//2
var x = 5;
console.log(x);//5
console.log(arguments[0]);//5
};
foo(2)
//解析
function foo(x){
var x;//x发生了变量提升,但x有初始值的时候x不会变为undefined
console.log(x);//2
x = 5;
console.log(x);//5
console.log(arguments[0]);//5
};
foo(2)
2.以函数为参数
function f(x,y = function() { x = 2; }){
console.log(x);//5
y();
console.log(x);//5
var x = 3;
console.log(x);//3
y();
console.log(x);//3
}
f(5)
//解析
function f(x,y = function() { x = 2; }){
//参数形成一个单独的作用域,函数y里的变量x指向的是参数x,而不是下边定义的x
var x;
console.log(x);//5 x有值的情况下,var x变量提升不会让x变为undefined
y();
console.log(x);//5
var x = 3;
console.log(x);//3
y();
console.log(x);//3
}
f(5)
3.题外话:如何让arguments值不变化
//会变化
function foo(x,y){
x = 1;
y = 2;
console.log(arguments[0]);//1
console.log(arguments[1]);//2
}
foo(3,4)
//不会变化
function foo(x = 5,y = 6){
x = 1;
y = 2;
console.log(arguments[0]);//3
console.log(arguments[1]);//4
}
foo(3,4)