一、作用域
var test="global";
function t(){
console.log(test);
var test="local"
console.log(test);
}
t();
结果:undefined , local
在C/C++中,花括号内中的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的。而Javascript压根没有块级作用域,而是函数作用域.
所谓函数作用域就是说:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。
上面的代码其实内部实现是这样的:
var test="global";
function t(){
var test;
console.log(test);
test="local"
console.log(test);
}
t();
二、作用域链
name="local1";
function t(){
var name="local2";
function s(){
var name="local3";
console.log(name);
}
function ss(){
console.log(name);
}
s(); //local3
ss(); //local2
}
t();
上面,s(),和ss()是两个独立的作用域链,变量定义互不干扰。
三、with 语句
说到作用域链,不得不说with语句。with语句主要用来临时扩展作用域链,将语句中的对象添加到作用域的头部。
student={name:"zhangsan",age:22,height:175,sister:{name:"lisi",age:21}};
with(student.sister){
console.log(name);
}
结果:lisi
with语句将student.sister添加到当前作用域链的头部,所以输出的就是:“lisi”.
with语句结束后,作用域链恢复正常。