有些面试题中会出现函数的形参与函数内部声明的变量或函数同名,这时应该输出多少?
函数的形参与函数内部声明的变量同名
function ab(x){
console.log(x); //3
var x;
console.log(x); //3
};
ab(3);
关于上述题目,需要理解 变量的定义和赋值
首先看下边的代码
var a = 1;
var a;
console.log(a);//1
这里第二行对a
是重复定义,而不是赋值, 变量只有定义后未赋值的情况下才会输出undefined
,除非手动赋值undefined
;那么这里,JS引擎对于重复定义的变量以最近赋值的语句为准,所以第二行的var a
会失效。同理,第一道题中的var x
也会失效,均输出3.
function ab(x){
console.log(x); //3
var x = 4;
console.log(x); //4
};
ab(3);
当函数中声明的变量被赋值,就会顶替掉传进来的参数
函数的形参与函数内部声明的函数同名
function ab(x){
console.log(x); //function
function x(){
console.log("我是函数")
};
console.log(x); //function
};
ab(3);
函数声明会提升,就是说, 函数体内声明的函数会提升到函数的第一行。
function ab(x){
console.log(x); //3
var x = function(){
console.log("我是函数")
};
console.log(x); //function
};
ab(3);
函数表达式不会变量提升
变量是引用类型呢
var foo = {n : 1};
(function(foo) {
console.log(foo.n);
foo.n = 3;
var foo = {n : 2};
console.log(foo.n);
})(foo);
console.log(foo.n);
var foo = {n : 1};
function fun(foo) {
var foo;
console.log(foo.n);//1
foo.n = 3;
foo = {n : 2};
console.log(foo.n);//2
};
fun(foo);
console.log(foo.n);//3
上两个代码是等价的。
接下来,foo={n:2}
;传进来的是个引用;现在给这个引用赋值,实际上就是让它指向新开辟的空间,存放着{n:2}
这个对象;那么之前的引用就断掉了,也就是说形参foo已经不指向全局里那个foo指向的空间了; 固然,在函数里,会输出新空间里的2;而在函数外,旧空间仍然没有改变,故为3;
参考链接:
JavaScript--函数的形参和函数内部声明的变量或函数重名时的问题
JS在函数中形参和局部变量同名的问题