javascript深入了解(作用域链)

观看者:有或者没有javascript基础的同学均可。

目标:了解我们代码执行时候变量和函数的访问顺序,以及作用域的深入分析。

实现目标方式:代码以及相关解释。

提醒:这边文章只是帮大家了解作用域链而非原型链,不过作用域链也是以后原型链的学习的基础,我会在以后博客中更新我对原型链理解,并分享给大家。

什么是作用域链?先看例子:

var color = 'red';
function getColor(){
	alert(color);
	color = 'blue';
	alert(color);
}
getColor();//red,blue

作用域链:就是当函数执行的时候会创建由变量对象构成的作用域链,作用域链就是保证所有变量和函数的有序访问。
看上面这段代码,var color = 'red'; 这个是最外层的是共用环境中的一个变量,getColor这个函数又有了自己的环境,但是当调用第一个alert(color)的时候访问的是外层的color,当第二次调用color的时候由于函数里面重新定义了color所以背覆盖成了blue。也就是说当我调用getColor(),他创建了一个当前函数的 活动变量对象,包含 arguments(arguments是函数传入的参数)和color=‘blue’,他位于链的下端也就是最内层,而var color='red'是链条的上一层也就是外一层,内层有权访问外一层的变量。由于变量的外一层是window环境所以我们用视图表示的是:

window
|
|——color='red'
|——getColor()
	|
	|——color='blue'
访问的时候由下往上访问。得到值就返回。不继续搜索,所以很明显如果所搜的变量在第一层作用域中速度是最快的。如果在外部访问内部,也就是逆着作用域链寻找是会出错的。

function getColor(){
	var newcolor = 'blue';
}
alert(newcolor);//error
上面代码newcolor是getColor内部的变量,而外部的alert(newcolor)为window的作用域,在最外层,由于也不能逆着作用域链找,所以按作用域链由下往上找的话找不到,也就出错了。

javascript 中有一些特性,你可能觉得不可思议

for(var i-0; i<10; i++){
	//dosomething(i)
}
alert(i);//i=10;
在其他语言中如java,c,c++ 通常for里面是一个代码块,外面是不能访问的,但是javascript可以访问,并且访问的是i的最后值。同样的也存在于其他块级作用域中如 if语句。

如果你想在function外面也能访问里面的东西,那就需要在作用链上加点手脚了。还是前面的例子:

function getColor(){
	newcolor = 'blue';
}
alert(newcolor);//blue
当去掉的var 关键字声明的变量竟然可以在外部访问,是由于如果不用var声明变量,这个变量默认的就是window的属性,位于最外层作用域,所以当然能访问,因此如果不用var 声明变量的话,可能会出现未知错误,所以不提倡,但可以用window.color“声明”。

最后解释一下, 上面for循环和getColor方法,用作用域链解释就很明白了, for循环外面能访问到for循环里面的值,因为处于同一作用域中,for,if代码块不会分割出新的作用域链,而getColor方法是分割成新的作用域链的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值