形参和变量同名时
预处理阶段会处理形参,变量声明提前、函数声明提前。主要是一个预处理的顺序。后处理的可能会覆盖先处理的结果。
根据测试案例得出处理顺序时:变量声明提前、形参赋值、函数声明提前。
所以如果同时有函数和形参同名的化,标识符指的是函数声明。
感觉这样理解挺好的。
function fn(a){
alert(a);
var a;
alert(a);
}
fn('hello');
function fn(a){
var a;
var a = 'hello'
alert(a);
alert(a);
}
fn('hello');
function fn(a){
alert(a);
var a = 'hi';
alert(a);
}
fn('hello');
function fn(a){
var a;
var a = 'hello';
alert(a);
a = 'hi';
alert(a);
}
fn('hello');
function fn(a){
alert(a);
let a = 'hi';
alert(a);
}
fn('hello');
function fn(a, b){
console.log(a, b);
var b = 'zhang'
function a() {}
console.log(a, b);
}
fn('hello', 'chen');
function fn(a){
var b;
var a= 'hello'
var b = 'chen'
function a () {}
console.log(a, b);
b = 'zhang'
console.log(a);
}
fn('hello');
function fn(a, b){
console.log(a, b);
var b = 'zhang'
function a() {}
console.log(a, b);
}
fn('hello', function c() {alert(1)});
function fn(a){
var b;
var a= 'hello'
var b = function c() {alert(1)}
function a () {}
console.log(a, b);
b = 'zhang'
console.log(a);
}
fn('hello');
function fn(a='你好'){
alert(a);
var a = 'hi';
alert(a);
}
fn();
var foo = {n:1};
(function (foo) {
var foo;
console.log(foo.n);
foo.n = 3;
foo = {n:2};
console.log(foo.n)
})(foo)
形参和函数名时
function fn(fn){
alert(fn);
}
fn('hello');
形参和arguments同名时
function fn(arguments){
alert(arguments);
}
fn('hello');
参考
《JavaScript中同名标识符优先级》
《js中关于同名的情况(同名变量,同名函数,同名形参)》
|