题目:
下面这段代码的结果是?
var name = 'Tom';
(function() {
if (typeof name == 'undefined') {
var name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();
解析:
这里立即执行函数是一个块级作用域:里面的var会变量提升,如下:
var name = 'Tom';
(function() {
var name;
if (typeof name == 'undefined') {
name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();
答案就很明显了:Goodbye Jack
如果想打印Hello Tom,将var 换为let,let不存在变量提升:
var name = 'Tom';
(function() {
if (typeof name == 'undefined') {
let name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();
或者这样写:
var name = 'Tom';
(function() {
if (typeof name == 'undefined') {
name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();
首先在进入函数作用域当中,获取name属性 ,在当前作用域没有找到name ,通过作用域链找到最外层,得到name属性值为Tom.