一、
var n = 100;
function foo() {
n = 200;
}
foo();
console.log(n);
这题毫无疑问,答案是200。
foo函数内部没找到n,往上在全局作用域中找到了n的定义,并为其重新赋值为200。
二、
function foo() {
console.log(n);
var n = 200;
console.log(n);
}
var n = 100;
foo();
这题的答案是 undefined 和 200 。
分析过程如下:foo函数内的n有变量提升,第一次使用n时为undefined, 第二次使用之前就被赋值为200了。
三、
var n = 100;
function foo1() {
console.log(n); // 100
}
function foo2() {
var n = 200;
console.log(n); // 200
foo1();
}
foo2();
console.log(n); // 100
这里为了方便观察,就把答案直接用注释的方式写在代码里面。
函数作用域链是由代码的书写位置决定的,所以在当前位置找不到,会去代码书写位置的上一层作用域找。
所以foo1中的n是等于全局作用域中的100,而不是foo2作用域中的200.
四、
var a = 100;
function foo() {
console.log(a);
return;
var a = 200;
}
foo();
结果为undefined。
这题乍一看挺容易被迷惑,想当然地认为return后面的代码不会被执行,会直接向全局作用域去找a。其实foo函数内的a还是会有变量提升,所以此时打印的a是undefined。
五、
function foo() {
var a = b = 10;
}
foo();
// console.log(a); 这里会报错
console.log(b);
结果为 100;
乍一看以为是函数作用域内的值在外面是取不到的,其实foo函数内的那行代码可以拆解为下面的两行代码。
var a = 10;
b = 10;