var name = 'Tom';
(function() {
if (typeof name == 'undefined') {
var name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();
var name = 'Tom';
(function() {
if (typeof name == 'undefined') {
let name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();
var name = 'Tom';
(function() {
let name
if (typeof name == 'undefined') {
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();
函数执行过程分为两步,创建执行环境和执行代码,创建执行环境的时候声明变量,在执行代码阶段给变量赋值。
本例中,函数内部使用var 声明了name,所以在创建执行环境时,函数声明了一个私有变量name,函数执行阶段,if中的name找到了私有变量name,此时没有赋值,所以走的是true的分支。
如果在函数内部的if语句中使用let 声明name,则在创建执行环境的时候不会声明内部变量name(if花括号中name被认为是if的局部变量),在执行代码阶段,找到了全局变量name(全局变量name已经赋值了),所以此时if判断走false分支。
如果在函数内部if语句之前使用let声明name,那么同情况一一样,也会在函数内部声明私有name。所以走true分支
第 108 题:请写出如下代码的打印结果