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 变量作用域是基于其特有的作用域链的。在 JavaScript 中,变量作用域是指变量可以被访问和修改的范围。 JavaScript 没有块级作用域,而是基于函数作用域和全局作用域的。 ...
理解JavaScript变量作用域.pdf 本人还有几十本经典javascript书籍以及无数javascript资料,要的加我qq 568094881,本人网址:www.maoshanhai.com
JavaScript变量作用域是编程语言中一个非常核心的概念,它决定了变量在何处可被访问以及其生命周期。在这道面试题中,我们看到的是如何在不同作用域下声明和使用变量,特别是与for循环相结合的情况。 首先,我们要...
本文将从JavaScript权威指南出发,深入探讨变量作用域的相关知识点,包括全局作用域、局部作用域、以及闭包等高级概念。 #### 二、全局作用域与局部作用域 1. **全局作用域** - 定义:在JavaScript中,如果一个...
// 全局变量: 在script之间或者一个独立的js文件中,在全局作用域中定义的变量 全局变量。在任何位置都可以访问 // 全局作用域:在script之间或者一个独立的js文件 script之间或者一个独立的js文件里的内容区域...
基于JavaScript的变量作用域的辨析 本文探讨了JavaScript中的变量作用域问题,通过对两种变量的特性从不同角度进行分析和测试,讨论了如何控制变量作用域的有效方法。 变量作用域是JavaScript编程过程中经常遇到的...
JavaScript变量作用域是编程基础中的重要概念,它决定了变量在哪些范围内可以被访问。了解变量作用域可以帮助开发者更好地管理代码中的数据,防止意外的变量冲突,从而提高代码的稳定性和可维护性。 JavaScript中...
### Javascript变量作用域详解 Javascript变量作用域是编程中一个非常基础且重要的概念,理解它对于编写有效且可维护的代码至关重要。在Javascript中,变量的作用域主要分为两种:全局作用域和局部作用域。全局变量...
JavaScript变量作用域问题 JavaScript作为一门动态脚本语言,在变量作用域上与其他语言存在显著差异。变量的作用域(Scope)指的是变量可以被访问的代码区域,它决定了哪些部分的代码可以访问该变量。理解变量作用...
JavaScript变量作用域及内存问题是一个非常重要的概念,在编程过程中起着至关重要的作用。本文将对JavaScript变量作用域、内存问题以及相关的操作技巧进行深入的分析。 首先,我们需要了解变量作用域的相关知识。在...
解题前先回顾JavaScript变量作用域的知识。变量i和j都是使用var声明的,所以它们都是函数作用域,即它们在全局作用域内都可以被访问。接下来,执行循环体时,每一次循环都会执行以下步骤: 1. 先将arr[i]的值赋给...
JavaScript是一种广泛用于网页和网络应用的编程语言,其核心特性之一就是变量作用域。变量作用域决定了变量在何处可以被访问以及何时会被销毁。本文将深入探讨JavaScript中的全局变量、局部变量、变量提升、词法作用...
本文将深入探讨JavaScript中的变量作用域,以及它如何影响代码的运行和组织。 首先,我们来理解什么是变量作用域。在JavaScript中,变量作用域决定了变量在何处可以被访问和识别。主要有三种类型的作用域:全局作用...
Javascript变量作用域是编程中非常基础且重要的一个概念,它决定了代码中变量的可访问性和生命周期。在Javascript中,变量作用域有两个可能会被忽略的小特性,即with语句和try-catch语句对变量作用域的影响,以及...
在深入理解JavaScript变量作用域的概念之前,首先我们需要了解JavaScript中变量是如何声明的。在JavaScript中,可以使用`var`关键字来声明变量,这些变量会受到作用域规则的影响。变量的作用域决定了在何处可以访问...
### 不同浏览器JavaScript变量作用域的处理方法 #### 一、引言 JavaScript是一种广泛使用的脚本语言,它被设计用于网页开发,并逐渐扩展到服务器端编程和其他领域。JavaScript的作用域规则是理解其行为的关键之一,...
JavaScript 变量作用域是编程中的关键概念,它决定了变量在何处可以被访问以及它们的生命周期。在这篇文章中,我们将深入探讨JavaScript中的全局作用域、局部作用域、以及一些特殊情况,如函数内部变量的声明和对象...