好吧,接下来进入正题,主要看一些简单的demo来观察和了解浏览器是怎样初始化JavaScript中的变量以及函数,主要涉及到的点包括JavaScript中的作用域以及执行环境,对这方便不是很了解的朋友可以参考文章最后的相关链接,看一些简单的demo吧。
1. 函数声明:
fn(); //输出 2 var fn= function(){ console.log(1); } function fn(){ console.log(2); } fn(); //输出 1
2. 关于局部变量和全局变量的访问:
var num1 = 1; function fn(num3){ console.log(num1); //输出 undefined console.log(num3); //输出 4 console.log(num4); //抛出错误 “num4 is not defined” console.log(num2); //抛出错误 “num2 is not defined” var num1 = num4 = 2; num2 = 3; var num3= 5; } fn(4);fn方法中依次输出了四个变量,不知道结果和你预期的有没有差异,输出的第一个参数num1在局部和全局环境中都有声明,局部变量优先级高于全局变量无可厚非,这里不一样的是在声明变量之前访问了num1,说明在预处理阶段构造执行环境时已经为局部变量分配了存储空间,赋的初始值是undefined罢了,输出的第二个变量num3在arguments和局部变量中都有,输出的是arguments中的参数变量,如果前面一个结论成立,那么说明arguments中的变量覆盖了局部环境中的变量,也就是说通过变量定义的方式优先级高于arguments对象数组中定义的变量。第三个输出num4时会报错误,说明连续赋值操作中除第一个变量以外的变量被视为全局变量处理,而全局环境中没有相关定义所以会出错,第四个num2输出出错也是由于被视为全局变量的原因,这两个地方的错误应该可以引用这样一句话:“个人自扫门前雪,莫管他人瓦上霜”,也就是说预处理阶段一个独立的执行环境只会维护自己内部的变量,忽略其他环境的变量。
3. 函数的调用:
function fn(t){ t(); function t(){ console.log(2); } var t = function(){ console.log(3); } } fn(function(){console.log(1)}); //output 2
if(true){ var m= 1; } console.log(m); //ouput 1
console.log(fn.toString()); if (true) { function fn(){ return 1; } }else { if(false){ function fn(){ return 2; } } }
if (true) { function fn(){ return 1; } }else { if(false){ function fn(){ return 2; } } } console.log(fn.toString());
5. 关于命名函数表达式:
fn = function() {return true;}; gn = function() {return false;}; (function() { fn = function fn() {return false;}; })(); console(fn());
var fn = function fn_alias(){ console.log(fn_alias.toString()); };
原文:http://blog.csdn.net/lmenglove/article/details/18795267