我写这个博客的时候,感觉是在当一个作者,在对你们讲述似的。但是我写这个博客主要是因为自己学了这个知识,过段时间就记忆模糊,又要去各方面查阅资料,所以就觉得动手记录下来,便于自己以后能够快速的回忆起来,要是能够帮助到更多的朋友,何尝不是一件快乐的事呢!
前面已经写到了关于javascript的this关键字,还有闭包。这些或多多少的都会牵连到作用域(更准确的应该叫做执行环境)。搞懂了作用域,你会发现你平时不能解释的一些问题得以解决了。
javascript的作用域分为两种:全局作用域和函数作用域。
每个作用域都有一个与之关联的变量对象(variable object),当前环境中的变量和函数都保存在对应的变量对象中。虽然我们编写的代码无法访问这个对象,但是在处理数据时会在后台使用它
1.全局作用域
全局作用域是最外围的作用域,在web浏览器中,全局作用域是window对象。因此,所以全局变量和全局函数都是作为window对象的属性和方法创建的。某个作用域中的所有代码执行完毕之后,该作用域被销毁,保存在其中的变量和函数也随之销毁(全局作用域知道程序退出才销毁,比如网页或浏览器被关闭。)
2.函数作用域
函数作用域是当这个函数被执行时,执行流进入这个函数,函数的作用域被推进一个环境栈中。而函数执行完毕之后,栈将其弹出,把控制权交给之前的作用域。
当代码在一个环境中执行时,会创建一条作用域链,作用域链的用途是保证所有在这条作用域链上的变量和函数的有权限访问。当前执行环境的变量对象始终在作用域链的前端。活动对象最开始只有一个变量,即arguments对象(它是函数参数的类数组对象,全局作用域是没有这个对象的)。
变量的解析是从作用域链的最前端往全局作用域一级一级的查询的,直到找到变量为止,否则就报错。
var name="window"; alert(name);//window 代码执行到这儿,执行环境里只有全局变量name function fn(){ alert(name);// undefined 当一个函数进入执行环境,首先会声明它内部的变量和函数,但是不赋值 var name="fn_name"; alert(name);//fn_name 首先在fn这个作用域找name这个变量,若是函数内没有name这个变量,它将会向上查找就会弹出"window". }
另外说一下,javascript没有块级作用域。
if(true){ var name="tom"; } alert(name);//tom for(var i=0;i<10;i++){ var j="jim"; } alert(i);//10 alert(j);//jim