变量声明冲突:
对于同名的变量声明会被忽略,Javascript采用的是忽略原则,后声明的会被忽略,变量声明和赋值操作可以写在一起,但是只有声明会被提升,提升后变量的值默认为undefined,结果是在赋值操作执行前变量的值必为undefined
function fn(){ console.log(a); // undefined var a=1; console.log(a); // 1 var a=2; console.log(a); // 2 } fn();
函数声明冲突:
对于同名的函数声明会被覆盖,Javascript采用的是覆盖原则,先声明的会被覆盖,因为函数在声明时会指定函数的内容,所以同一作用域下一系列同名函数声明的最终结果是调用时函数的内容和最后一次函数声明相同
function fn(){ console.log(a); // function a(){alert(2);} function a(){alert(1);}; function a(){alert(2);}; } fn();
变量与函数声明冲突:
对于同名的函数声明和变量声明,Javascript采用的是声明阶段忽略变量声明,赋值阶段覆盖原则,函数声明没有赋值阶段,所以被变量的赋值给覆盖了;
function fn(){ console.log(a); // function a(){alert(1);} function a(){alert(1);}; var a=1234545; console.log(a); // 1234545 } fn(); // 下面的第一个console.log会在函数预执行结束后立即调用,此时a类型是函数 function fn(){ console.log(a); // function a(){alert(1);} var a=1234545; function a(){alert(1);}; console.log(a); // 1234545 } fn();
由于在提升时函数声明会提升到变量声明之前,变量声明一定会覆盖函数声明,所以结果是声明阶段函数声明有效,执行时变量赋值覆盖函数声明,最终a是变量!
另外:函数内部变量与该函数名冲突会怎样?这篇文章有补充:函数内部变量与该函数名冲突会怎样?