例子:
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f;
}
checkscope()();
具体流程:
//遇到全局上下文
ECStack.push(globalContext) //此时的调用栈[globalContext]
//调用checkscope,进入checkscope的函数内
ECStack.push(<checkscope context>) //压栈
//内部没有函数调用,返回函数f
ECStack.pop(<checkscope context>) //弹栈
//返回的f被调用了
ECStack.push(<f context>) //压栈
ECStack.pop(<f context>) //弹栈
题目一:
function foo() {
console.log(a);
a = 1;
}
foo();
function bar() {
a = 1;
console.log(a);
}
bar();
题目二:
console.log(foo);
function foo(){
console.log("foo");
}
var foo = 1;
console.log(foo);
原因是会优先处理函数声明,再处理变量声明。如果变量名称跟已经声明的形参或函数相同,则变量声明不会干扰已经存在的这类属性。
题目三:
var foo = 1;
console.log(foo);
function foo(){
console.log("foo");
};