js中作用域链的问题

先来看一个列子:

 

<script type="text/javascript">
/*
 * js函数是一个对象,scope是仅供js引擎访问的内部属性,包括创建对象属性的集合
 * 当一个函数创建后它的作用域链被填充,
 * 每个内部对象是独一的,所以多次调用一个函数会导致多次创建
 * 当函数运行过程中遇到一个变量要搜索作用域,
 */ 
var tt = 'aa';
function test() {
	alert(tt);
	var tt = 'bb';
	alert (tt);

}
test();
</script>

 看这段代码第一个alert(tt)弹出的是undefined 第二个弹出的是 'bb',而外面定义的'aa'那?我们都知道js中的定义用var来声明,外面的'aa'为全局变量,按照js的顺序执行过程第一个alert应该弹出'aa'.但实际弹出的是'undefined',这是为什么那?

这就是js的作用域对象起的作用,当每个函数在调用的时候都会生成一个独立的域对象,也就是运行时上下文,这个域对象包括了两部分,第一部分是函数自身声明的对象,另一部分是js对象自身的属性,在函数执行过程中当遇到一个变量的时候,查找的顺序也是从前端想后深入查找,当查找不到的时候就返回'undefined'。而这个地方外面定义的'aa'在第一场alert()的时候为什么没有被找到,这是因为在函数里面有定义了var tt = 'bb',这样在在作用域那他的优先级比较高,而在第一次调用的时候tt = 'bb'没有被定义,所以第一次alert()会弹出 'undefined'.

我们在写js的时候尽量减少变量搜索的深度,多用局部变量代替全局变量,或是声明一个全局变量对象,把用到的变量都看作对象的一个属性来访问。

 

 var myParameter = {
       aa : '123',
       bb : 'dfdf'
}

myParameter.cc = 'nihao';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值