---恢复内容开始---
/*作用域
在js中,函数嵌套是非常普遍的,首先在函数内部寻找,寻找不到就会到函数外层寻找……直到window*/
var c=5;
function t1(){
var d=6;
function t2(){
var e=7;
alert(c+d+e);
}
t2();
}
t1();//18
/*声明变量var的作用 var实在函数运行的上下文中,声明一个变量,如果不加var则仅仅理解为一个赋值操作,不要狭隘的理解为一个全局变量*/
alert(window.d); //undefined
alert(window.e);//undefined
function t(){
d=5;
var e=6;
}
t();//d没有加var仅仅是一个赋值操作,寻找t域内的函数,没找到,继续寻找……window,window.d=5
alert(window.d);//5
alert(window.e);//undefined
function t1(){
var d;
function t2(){
d=5;
e=6;
}
t2();
}
t1();
console.log(d);//d is not defined错误
console.log(window.d);//undefined
console.log(e);//6
var str1="global";
function t1(){
console.log(str1);
console.log(str2);
str2="local";
}
t1();
第一行执行,在t1内寻找str1,没有,又在window上寻找str1,有,打印str1
第二行执行,在t1内寻找str2, 没有,又在window上寻找str2,没有,因此是str2 is not defined
第四行执行,(实际出错,没有执行到这一行),才把全局的str2赋上值
var str1="global";
function t1(){
console.log(str1);
console.log(str2);
var str2="local";
}
t1();
第一行执行,在t1内寻找str1,没有,又在window上寻找str1,有,打印str1
第二行执行,在t1内寻找str2, 没有,又在window上寻找str2,没有,因此是undefined
第四行执行,(实际出错,没有执行到这一行),才把全局的str2赋上值
js代码自上而下执行,但是js代码在整体运行前分:词法分析期和运行期
自上而下执行之前,先有一个词法分析过程,以上面为例:
1:分析t1函数
t1(){
var str2; //分析出t1内有str2局部变量,注意此时函数未执行,因此str2的值是undefined
}
2:执行t1函数
console.log(str1);//global
console.log(str2);//undefined
var str2="local";//local