预解析一
var name = 'World!';
(function() {
if (typeof name === 'undefined') {
var name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();
答案:Goodbye Jack
注释
1.代码执行前,先预解析。
2.var变量提升,提升到当前作用域最前面。
3.首先给全局的变量name赋值为’World!’,然后匿名函数自调用。
4.把匿名函数里的变量name提升到当前作用域最前面。
5.匿名函数里的name声明但未赋值,所以name为undefined。typeof name === undefined为true。
6.所以执行结果为Goodbye Jack。
下面是预解析代码过程
var name;
(function() {
var name; 变量声明未赋值==>undefined
if (typeof name === 'undefined') {
name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();
name = 'World!';
词法作用域
词法作用域规则:函数的作用域在声明的时候就已经决定了,与调用位置无关。
var a = 10;
function aaa() {
alert(a);
}
function bbb() {
var a = 20;
aaa();
}
bbb();
答案:10。
分析:
1.预解析,把a的声明和函数aaa() 和函数bbb() 声明提升到当前作用域最前面。
2.给全局的a赋值为10,然后调用bbb()。
3.函数执行前要预解析,将函数bbb里的变量a提升到当前作用域,然后执行函数bbb。并给a赋值为20.再调用函数aaa()。
4.因为函数aaa的作用域在声明的时候就已经在全局了,所以aaa内部访问变量a的时候,按照作用域链的查找规则,找到全局的a。并alert(a)为10。
下面是预解析代码过程
var a;
function aaa(){
alert(a);
}
function bbb(){
var a;
a = 20;
aaa();
}
a = 10;
bbb();
作用域
题目一:
var scope = 'global scope';
function checkScope() {
var scope = 'local scope';
function f() {
return scope;
}
return f;
}
var fn = checkScope(