一、作用域链的前端,指当前执行的代码所在环境的变量对象
内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数(向上搜索)
二、延长作用域链的方法:
1、with语句
function buildUrl(){
var qs="?debug=true";
with(location){ //将location对象添加进buildUrl()的作用域链前端
var url=href+qs; //此处href即location.href
}
return url;
}
alert(buildUrl()); //输出的是一个拼接的url
结果:
2、try-catch语句的catch块
try{
aler('hello world');
}catch(e){
console.log(typeof(e)+e)
}
结果:
三、JavaScript没有块级作用域
如:
1、if语句中的变量声明会将变量添加到当前的执行环境
if(true){
var color='blue'
}
alert(color);//'blue'——if语句内的变量声明会被添加到当前执行环境(此处就是全局环境)
2、for语句中创建的变量,在for循环执行完毕后,也依旧存在于for外部的执行环境
for(var i=0;i<10;i++){
console.log(i)
}
alert(i);//10——for语句创建的变量i在循环执行完毕也依旧存在于环境中(此处就是全局环境)
四、如果初始化变量时没有使用var声明,该变量会自动被添加到全局环境
总结:
- 执行环境有全局执行环境和函数执行环境之分
- 每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链
- 函数的局部环境有权访问函数作用域中的变量、其包含(父)环境至全局环境
- 全局环境只能访问在全局环境中的变量和函数,而不能直接访问局部环境中的任何数据