问:打印?
p1
var message = "hello global";
function foo() {
console.log(message);
}
function bar() {
var message = "hello bar";
foo();
}
bar();
// "hello global"因为在编译的时候foo函数对象的父级作用域已经确定。
p2
var n = 100;
function foo() {
n = 200;
}
foo();
console.log(n);
// 200p3
function foo() {
console.log(n);
var n = 200;
console.log(n);
}
var n = 100;
foo();
// undefined 200执行函数上下文foo之前先编译该函数对象 ,因为还没有进行执行,所以AO对象里的n是undefined。 接着开始执行foo函数,在该函数作用域里先打印n,再赋值n,所以第一个n是undefined
p4
var n = 100;
function foo1() {
console.log(n); // 2, 100
}
function foo2() {
var n = 200;
console.log(n); // 1, 200
foo1();
}
foo2();
console.log(n); // 3, 100p5
var a = 100;
function foo() {
console.log(a);
return;
var a = 100;
}
foo();
//undefined和p3类似
p6
function foo() {
var a = b = 100;
}
foo();
// console.log(a); // error: a is not defined
console.log(b); //100var a = (b = 100);(从右向左) 会转化为 var a = 10; b = 10;因为js中直接对一个没有定义的值赋值,会提到全局对象里,但是在其他语言中是错误的语法