好吧,接下来进入正题,主要看一些简单的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