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从来不会告诉你是否多次声明了同一个变量;遇到这种情况,他只会对后续声明视而不见,不过它会执行后续声明中的变量初始化。
浙公网安备 33010602011771号