函数形参与内部变量同名的问题

有些面试题中会出现函数的形参与函数内部声明的变量或函数同名,这时应该输出多少?

函数的形参与函数内部声明的变量同名

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在函数中形参和局部变量同名的问题

你可能感兴趣的:(函数形参与内部变量同名的问题)