JavaScript的函数是在局部作用域内运行的,在局部作用域内运行的函数体可以访问其外层的(可能是全局作用域)的变量和函数。JavaScript的作用域为词法作用域,所谓词法作用域是说,其作用域为在定义时(词法分析时)就确定下来的,而并非在执行时确定,如下例:
var str = "global";
function scopeTest(){
alert(str);
var str = "local";
alert(str);
}
scopeTest();//先打印undefined,然后打印local(注意:而不是先打印global,再打印local)
提到“词法作用域”,就必须得同时提到“作用域链”,两者结合才能有效理解:
第1行的str(global)在定义时首先被存入作用域链的头部即全局作用域;
在调用scopeTest时,js解释器生成1个调用对象(call object),并将scopeTest内通过var定义的所有变量设为它的一个属性(此处只有一个用var定义的变量str),然后再把这个对象加到作用域链的最前端,通俗理解即具有最优先的访问权;
在访问str时,首先查询scopeTest的调用对象,如果从中没找到str则查询仅挨该对象的上一个作用域,以此类推直至全局作用域;
此例中从调用对象中即可查到str,因此全局对象中的str被覆盖:第3行中,调用对象中有str定义但未赋值,因此为undefined;第4行,赋值;第5行,有值,是local。
var str = "global";
function scopeTest(){
alert(str); //global
}
scopeTest();
为什么这里是global?因为scopeTest的调用对象里没有str的定义,因此必须查询全局作用域,所以得出global。
为什么“词法作用域”的效果是“函数在定义它的作用域中执行,而不是执行它的环境”?那是因为函数始终只能沿着定义它时就确定了的“作用域链”逐级访问变量,与外界执行环境无关。
一些编程习惯:
1.为了避免变量混乱或被覆盖,对于局部变量的定义一定不要忘记加上var关键字;
js函数的第一行开始定义该函数内用到的所有变量;
不在for,if,while等块中定义变量;
不在无须实例化的函数内使用this代替window去访问全局变量;
2.巧用匿名函数,减少命名冲突或变量污染;(把你的代码放在匿名函数里!那么,就不会和第三方的JavaScript冲突!)。将所有的代码封装到一个匿名函数中,并在它的定义结束后立刻执行它:
var str = 'tom';
(function(){
str = 'jack';
})();
alert(str); //打印出jack
再看一个例子:
var str = 'tom';
(function(){
var str = 'jack';
})();
alert(str); //打印出tom
3.避免使用全局变量?
看你用那钟方式编程,如果用面向对象的方式来组织代码的话,全局变量是比较相对的;
对于喜欢用过程化方式编程的人,全局变量还是给他们带来很大的灵活性的。
参考:
http://abruzzi.iteye.com/博客中的“javascript内核系列”
js变量作用域 相关博客:
http://shuxiang.iteye.com/blog/575268
http://lectery.iteye.com/blog/480401
http://muyu.iteye.com/blog/424372
http://lyang0000.iteye.com/blog/625912
分享到:
相关推荐
javascript变量作用域 希望对大家有帮助
理解JavaScript变量作用域.pdf 本人还有几十本经典javascript书籍以及无数javascript资料,要的加我qq 568094881,本人网址:www.maoshanhai.com
一道关于JavaScript变量作用域的面试题_.docx
当然我们知道全局变量是全局对象的属性,而局部变量是一个特殊的调用对象的属性,那么我们就可以再次关注一下变量作用域的表示法,对它进行再定义。有关作用域的新描述给理解多环境下的变量提供了一种有用的方法,它...
// 全局变量: 在script之间或者一个独立的js文件中,在全局作用域中定义的变量 全局变量。在任何位置都可以访问 // 全局作用域:在script之间或者一个独立的js文件 script之间或者一个独立的js文件里的内容区域...
Js中的变量作用域问题: 1、没有块级作用域。Js中的变量作用域不是以{}为界的,不像C/C++/Java。 如: 代码如下: if(true){ var name = “qqyumidi”; } alert(name); // 结果:qqyumidi Js会...
本文不打算深入讲解JavaScript变量作用域问题(其实本人也没有能力能把这一话题讲的深入些),也不讲“闭包”话题,本文只讨论最实用的JavaScript作用域知识点。 一、JavaScript作用域分类 JavaScript就两种作用域:...
本文实例讲述了JavaScript变量作用域及内存问题。分享给大家供大家参考,具体如下: 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别。JavaScript变量是松散型的(不强制类型)...
主要为大家介绍了一道关于JavaScript变量作用域的面试题,如何解决这道面试题,感兴趣的小伙伴们可以参考一下
javascript变量作用域在不同浏览器的实现处理代码
主要是对Javascript变量作用域进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
基于JavaScript的变量作用域的辨析.pdf
主要介绍了JavaScript变量作用域,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
刚看了一篇文章对js作用域的理解又会上升到一个新的台阶,javascript里变量作用域是个经常让人头痛抓狂的问题,接下来对经常遇到又容易出错的情况进行了简单总结,感兴趣的各位可以参考下哈
JavaScript程序设计变量作用域共4页.pdf.zip