1、undefined返回不同的场景。
以window.xxx引用全局变量,寻找不到,会作为某个属性不存在,返回undefined.
直接以XXX引用某变量,寻找不到,则是报xxx is not defined错误。
2、作用域问题。
//场景1
var str1 = 'global';
function t1(){
console.log(str1); //global
console.log(str2); // undefined
var str2 = 'local';
}
t1();
//场景2
var str1 = 'global';
function t1(){
console.log(str1); //global
console.log(str2); // str2 is not defined
str2 = 'local';
}
t1();
//场景3
function a(b){
alert(b);
function b(){
alert(b);
}
b();
}
a(1);//答案为两个b函数
总结:
JS代码执行:
a、先进行词法分析(预编译)
分析参数–>分析变量声明–>分析函数声明;
具体步骤:
1:函数运行前一瞬间,生成Active Object(活动对象),下称AO;
2:把收到的参数,形成AO的属性,参数的值即属性的值;
3:分析变量声明!如var age;
如果AO上还没有age属性,则添加AO属性,值为undefined
如果AO上已经有age属性,则不做任何影响
4:分析函数声明,如function foo() {},即把函数赋给AO.foo属性,如果此前foo属性已存在,则会被无情的覆盖。
var str = 'local';//分为分析过程和执行过程
//先分析声明 var str;才是str的值为undefined;
//再执行赋值操作 str = 'local';
b、然后JS代码自上而下执行;
js词法分析可以下文档:
js词法分析
燕十八JavaScript高级视频教程
初识JavaScript的解析与执行过程