在js中函数嵌套是非常普遍的,在函数嵌套中,对变量是如何寻找的?
答:首先在函数内寻找,寻找不到则往外层寻找···直到全局(window)区域
看一段代码
var c = 5;
function t1(){
var d = 6;
function t2(){
//var d = 3; // 去掉注释后的变化
var e = 7;
alert(c+d+e);
}
t2();
}
t1();
分析:
1,首先调用t1
函数,而t1
函数又调用t2
函数
2,t2
函数中,计算变量c,d,e的和,为18
3,去掉t2
函数中注释,则变量d的值为3
,最终alert
为15
关键字var的作用
var是在函数运行的上下文中,声明一个变量。
如果不加var,则仅仅只是一个赋值操作。
console.log(window.d);//undefined
console.log(window.e);//undefined
function t(){
d =5;
var e = 6;
}
t();
console.log(window.d);//5
console.log(window.e);//undefined
分析
1,js代码从上到下顺序执行,当执行第一,二行时,全局对象window下无属性d
和e
,而对象的赋值,非常简单,当执行到console.log(window.d)
时,window
对象就有了d
属性,但是并没有赋值,因此输出undefined
2,继续向下执行,调用t
函数,d=5
没有关键字var
,则仅仅是个赋值操作,寻找t
函数的作用域内,没找到,继续寻找=》window
,没找到,执行window.d
;而var e = 6
,是变量的声明,且在t
函数内部。
3,因此最后两行console
则分别输出5
和undefined
作用域的练习
【注意】
1,以window.xxx引用全局变量,寻找不到,作为某个属性不存在,返回undefined,变量定义了,但是没有赋值
2, 以XXX引用某变量,寻找不到,则报xxx is not defined 错误。变量未定义。
习题
function t1() {
var d;
function t2(){
d = 5;
e = 6;
}
t2();
}
t1();
console.log(e);
console.log(d);
console.log(window.d);
作用域考核
【注意】这是一个极容易又极容易出错的基础面试题。
自己先行分析运行后的结果,然后在看解释。
var str1 = 'global';
function t1(){
console.log(str1);
// str2 = 'local';//注释去掉后的运行结果
console.log(str2);
var str2 = 'local';
}
t1();
js代码自上而下执行,但是js代码在执行前有一个词法分析的过程。
1.词法分析
//此时str1定义但是未被赋值,
// 所以str1的值为undefined
var str1;
t1{
// 此时str2定义但是未被赋值,
// 所以str2的值为undefined
var str2;
}
2.执行语句顺序为:
str1 = 'global';
console.log(str1);
console.log(str2);
str2 = 'local';
3.输出
global
undefined
//如果去掉第四行注释,`console.log(str2);`输出`local`
【下一篇:谈谈词法分析】
【欢迎关注,讨论,共同学习】