一、JavaScript作用域分类
JavaScript就两种作用域:全局(window)、函数级(function)。函数级(function)不要理解为“块级(大括号{} 级)”。
二、区分及定义JavaScript全局变量与局部变量
1.1、定义在所有函数最外边,使用或不使用var关键字定义的变量都是全局变量。全局变量其实被解析成window对象的一个属性,所以我们可以以 “window.全局变量名”方式访问它 ,推荐在没有必要的情况下直接使用变量名访问。如下例子演示了全局变量定义最常见的方法:
var msg1='This is message 1'; msg2='This is message 2'; alert(window.msg1); //This is message 1 使用window关键字进行访问 alert(window.msg2); //This is message 2 alert(msg1); //This is message 1 省略window关键字的访问方式 alert(msg2); //This is message 2 function otherFunction(){} //其它一些函数或对象声明代码 var otherObject={};
1.2、在函数内(局部变量运行时环境)一样可以定义和获取全局变量。定义的方法就是不使用var关键字,而在局部环境中亦可轻松获得全局变量内容, 直接使用全局变量名引用即可。需要注意的是:如果函数内定义了与全局变量同名的局部变量,那么此时函数体将优先使用自己的局部变量,如果此时你非要使用同 名的全局变量,请加上window前缀 。举例如下:
var msg1='This is message 1'; var msg3='This is message 3'; function otherFunction() { msg2='This is message 2'; //不使用var关键字,其实也是定义一个全局变量 var msg3='Message 3'; alert(msg1); //This is message 1 (函数内当然可以访问到外面定义的全局变量,再深的函数嵌套一样能正确获到这个全局变量,这是JavaScript闭包的其中一种体现) alert(msg3); //Message 3 (局部变量msg3) alert(window.msg3); //This is message 3 (使用window前缀访问同名的全局变量msg3) alert(this.msg3); //This is message 3 (因为otherFunction ()定义在一个全局的环境中,此时otherFunction ()的this也是指向window,所有你看到window. msg3是等于this. msg3的) } otherFunction(); //otherFunction函数外面定义的msg1和里面定义的msg2依然是全局变量 alert(window.msg1); //This is message 1 alert(window.msg2); //This is message 2
2.1、使用var关键字,在函数体内定义的变量是局部变量 ,此变量能供其下面所有语句块({})及子函数使用。这个变量在这个函数里任何地方都可以访问到,但却不能在这个函数的外面“直接”访问 (闭包允许间接访问,或代理访问,此知识点不在本文讨论范围)。举例如下:
function showMsg() { if (true) { var msg='This is message'; } alert(msg); //This is message } showMsg(); alert(typeof(msg)); //undefiend //这里在if {}大括号内定义的变量msg还能在if外showMsg()内访问到,但在showMsg()外则是无法访问的
2.2、父函数的变量可以被子函数访问 ,但子函数的变量却不能被父函数访问 ,显然这与我们一开始说的函数级作用域是相吻合的。这看起来老爸爽快些,儿子吝啬些。举例如下:
function showMsg() { var MsgA='Message A'; this.setMsg=function(msg) { var MsgB='Message B'; alert(MsgA); //Message A (子函数setMsg()可以访问父函数showMsg()的局部变量MsgA) } alert(MsgB); //MsgB未定义 (在父函数中不能访问其子函数中定义的变量MsgB) } var sm=new showMsg(); sm.setMsg('Message string');
三、需要注意的几个地方及使用技巧
1、为了避免变量混乱或被覆盖,对于局部变量的定义一定不要忘记加上var关键字 (必要时我们要变量使用完后主动释放 它,即“变量名=null”),同时建议把所有变量集中定义在每个函数体内的开头位置。举例如下:
var msg='Message'; function showMsg() { var msg; //这里即使不小心使用了与全局变量一样的变量名,也不用担心覆盖同名全局变量的问题 var a; var b; var c; for (a=0;a<10;a++){} this.setMsg=function(){} }
2、巧用匿名函数,减少命名冲突或变量污染 。如下两段代码其实实现了相同的功能,而第一段代码写法自己可以在那个匿名函数内大胆用自己想用的变量名等,不用担心自己定义的变量覆盖其他人定义或自己其它地方定义的变量。
//定义一个匿名函数,然后把代码丢到这个匿名函数里面,能有效减少命名冲突或变量污染,这是常见JS框架的做法 (function() { var msg='This is message'; alert(msg); })(); document.write(msg); //msg未定义 (匿名函数外的其它方法已无法调用msg这个变量) //----------------------------- var msg='This is message'; alert(msg);
3、不建议在无须实例化的函数内使用this代替window去访问全局变量 。一般情况使用this关键字的函数应当作为JavaScript类来处理(我喜欢把“cls”作为类名的前缀)。以下函数如果仅当作普通函数调用一下,就不应该出现this关键字,因为这通常是去操作一个全局变量了。例子:
function clsMsg() { this.msg='This is default message'; this.showMsg=function() { alert(this.msg); } } sMsg=new clsMsg(); sMsg.msg='This is new message'; sMsg.showMsg();
相关推荐
### 作用域的定义及应用 #### 一、引言 在编程中,作用域是一个非常重要的概念,它定义了变量、函数等标识符在程序中的有效范围。正确理解和运用作用域有助于编写出更加清晰、高效且易于维护的代码。本文将详细...
### 什么是作用域? 作用域是编程语言中的一个重要概念,它定义了变量或者标识符的可见性和生命周期。简而言之,作用域确定了一个变量在哪些部分的代码中是可以被访问和使用的。 ### 变量作用域定义 在程序中,...
// 全局作用域:在script之间或者一个独立的js文件 script之间或者一个独立的js文件里的内容区域,在全局作用域中定义的作用域 全局作用域。 在任何位置都可以访问 // 局部变量:在函数作用域之间里的一个或者...
在Vue.js框架中,作用域插槽(Scoped Slots)是一个非常重要的特性,它允许我们更加灵活地控制组件的渲染内容。这个特性使得父组件能够传递复杂的数据结构到子组件,并控制子组件内部如何呈现这些数据。现在,我们将...
### 深入理解变量作用域 #### 一、引言 在JavaScript编程语言中,作用域是一个核心概念,它决定了变量的可见性和生命周期。作用域不仅影响着代码的执行效率,更是解决bug的关键所在。本文将从JavaScript权威指南...
JavaScript 变量作用域详解 JavaScript 变量作用域是基于其特有的作用域链的。在 JavaScript 中,变量作用域是指变量可以被访问和修改的范围。 JavaScript 没有块级作用域,而是基于函数作用域和全局作用域的。 ...
在Spring框架中,Bean的作用域是管理Bean实例创建和存活范围的重要概念。Bean的作用域决定了在特定上下文中,Spring容器如何管理和提供Bean的实例。在Spring中,有五种主要的Bean作用域: 1. **Singleton作用域**:...
JSP中的四种作用域 JSP 中的四种作用域是指 page、request、session 和 application,这四种作用域都是用于存储和共享数据的,下面对每种作用域进行详细的解释: 1. Page 作用域 Page 作用域是 JSP 页面的内置...
2. **request**作用域:比page作用域稍大,一个请求中的所有资源(如Servlet、JSP)都能访问在此作用域内设置的属性。这意味着,如果一个请求经过了多个Servlet或JSP,这些对象依然可用。`request.setAttribute()`...
这些对象的作用域是指它们可以在代码中的哪些部分被访问和使用。理解Java内置对象的作用域对于编写高效、安全的代码至关重要。 1. **类加载器对象(ClassLoader)** 类加载器负责加载类到JVM(Java虚拟机)中。...
C++ 作用域规则 C++ 中的作用域规则是指变量的有效范围,它们在哪里创建,在哪里销毁。变量的有效作用域从它的定义点开始,到和定义变量之前最邻近的开括号配对的第一个闭括号。下面是 C++ 中各种类型的变量的作用...
在编程领域,对象的作用域是理解面向对象编程(OOP)的关键概念之一。它涉及到一个变量或对象在程序中的可见性和生命周期,对于代码组织、内存管理和数据安全性具有重要意义。本章示例代码将深入探讨对象作用域的...
### JavaScript 变量作用域详解 #### 一、引言 在探讨JavaScript的面向对象特性之前,理解变量作用域的概念至关重要。本篇文章旨在通过一系列示例和解释,帮助读者掌握JavaScript中的变量作用域机制。 #### 二、...
关于ES6中let 和 const 命令的用法以及注意事项:中的报错的样式ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。
方法作用域是指变量定义在方法内部的作用域,块作用域是指变量定义在块内部的作用域,类作用域是指变量定义在类内部的作用域,而实例作用域是指变量定义在实例内部的作用域。 在 Java 中,变量的生命周期和作用域是...
DHCP 服务器管理作用域 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)服务器管理作用域是计算机网络中的一种重要技术,主要用于管理和配置网络中的 IP 地址分配。下面是关于 DHCP 服务器管理作用...
**AngularJS 0005:作用域** 在AngularJS框架中,作用域(Scope)是应用程序数据模型和视图之间的桥梁,它负责管理和维护应用中的数据。理解作用域是深入学习AngularJS的关键,因为它是应用程序中数据绑定的核心...
在 Element UI 的表格组件中,"作用域插槽"(Scoped Slot)是一种自定义列模板的方式,允许用户对表格的列内容进行高度定制,以满足复杂的业务需求。本文将深入探讨 Element UI 表格组件的编辑功能以及如何使用作用...
Python语言的基础之一是作用域,它是程序中定义变量的一个范围,决定了变量的可访问性。作用域决定了在程序的不同部分可以使用哪些变量名。理解作用域对于编写清晰、无误的代码至关重要。 1. **作用域(Scope)** ...
C语言中的变量和函数的作用域与生存期是编程中至关重要的概念,它们直接影响到代码的组织和执行效率。首先,我们来详细了解这些知识点。 **作用域(Scope)**: 作用域指的是变量或函数在程序中可见的范围。C语言中...