function test() { console.log("out"); } (function () { if (false) { function test() { console.log("in"); } } test(); })();
解析:可以这样理解,找到所有用function声明的变量,在环境中创建这些变量,但要注意的是,这些变量还没有被赋值,所以闭包中的test就变成了undefined,所以加上括号就会报错
如果在函数外面,在不同浏览器就会有不同的结果
/************函数变量重名*************/ function test() { console.log(1); } if (true) { function test() { console.log(3); } } else { function test() { console.log(2); } } test(); //最新的浏览器输出3 safri输出2 在早期的一些过渡版本中输出1 //在函数内部只有一种答案,变量存在的情况也是一样 /**************变量重名**************/ var a = 10; if (false) { var a = 11; } console.log(a); //10 var c = 10; var c; console.log(c); //10 var b = 10; (function () { if (false) { var b = 11; } console.log(b); //undefined })();
执行过程:
var a; var a; a = 10; var b; b = 10; (function () { var b; if (false) { b = 11; } console.log(b); //当前作用域,局部作用域的优先级是高于全局变量的,所以这里为undefined })();
知识点:
局部作用域的优先级是高于全局变量的,所以这里为undefined
js从来不会告诉你是否多次声明了同一个变量;遇到这种情况,他只会对后续声明视而不见,不过它会执行后续声明中的变量初始化。