每一种语言都有变量的概念,变量是用来存储信息的一个元素。比如下面这个函数:
2{
3 this.name = name;
4 this.age = age;
5 this.from = from;
6 this.ToString = function()
7 {
8 return "my information is name: "+this.name+",age : "+this.age+", from :" +this.from;
9 }
10}
Student类有三个变量,分别为name(名字),age(年龄),from(籍贯),这三个变量构成了描述一个对象的信息。当然,这里还有一个方法用来返回Student的信息。
但是,我们是不是定义了一个变量,它就能一直存在着,并且还有可能在任何地方都能被访问和使用直到其被销毁?仔细想想,上面的需求是比较过分的,因为某些变量在某个功能实现后就不再利用了,但如果这个变量还存在的话,就占用了系统资源了,俗语曰:“站着茅坑不拉#$%”。
于是我们对变量的及时和按需求地销毁有一个探讨的话题了。
好,切入正题吧,就本人所接触过的来讲,js中支持如下几种类型的变量,分别为:局部变量、类变量、私有变量、实例变量、静态变量和全局变量。接下来我们就一一探讨研究下。
局部变量:
局部变量一般指在{}范围内有效变量,也就是语句块内有效的变量,如:
2{
3 var sum = 0;
4 if(flag == true)
5 {
6 var index;
7 for(index=0;index<10;index++)
8 {
9 sum +=index;
10 }
11 }
12 document.write("index is :"+index+"<br>");
13 return sum;
14}
15//document.write("sum is :" +sum+"<br>");
16document.write("result is :"+foo(true)+"<br>");
该代码执行后输出的结果为:“index is :undefined” 和 “result is :0”,我们可以看到希望输出的index变量的值为undefined,也就是未定义。因此我们可以发现,index变量在if语句块结束后即被销毁了。那么“sum”变量呢?这个变量在foo()函数段执行完毕后被销毁了,如果您去掉我注释的那条语句,再执行,您将会发现系统将报错。值得注意的是,如果我把上面的foo()函数改成如下:
2{
3 var sum = 0;
4 for(var index=0;index<10;index++)
5 {
6 sum +=index;
7 }
8 document.write("index is :"+index+"<br>");
9 return sum;
10}
您将可以看见可以输出index值("index is :10"),这个是js和其他语言的不同地方,因为index是在for循环的{}外面定义的,因此其作用范围在foo()函数使用完毕后才销毁。
类变量:
类变量,实际上就是类的一个属性或字段或一个方法,该变量在该类的一个实例对象被销毁后自动销毁,比如我们开始时举的Student类。这个我们不多讨论,大家可以自己试一下。
私有变量:
私有变量,值得是某个类自己内部是用的一个属性,外部无法调用,其定义是用 var 来声明的。注意如果不用var 来声明,该变量将是全局变量(我们下面将会讨论),如:
2{
3
4 this.name = FormatIt(name);
5 this.age = age;
6 this.from = from;
7 var origName = name;
8 var FormatIt = function(name)
9 {
10 return name.substr(0,5);
11 }
12 this.ToString = function()
13 {
14 return "my information is name: "+origName+",age : "+this.age+", from :" +this.from;
15 }
16}
17
18
这里,我们分别定义了一个origName和FormatIt()两个私有变量(按面向对象的解释,应该用类的属性来称呼)。
我们把这种情况下的方法也成为变量,因为该情况下的变量是个function类型的变量,而function也属于Object类的继承类。在这种情形下,如果我们定义了 var zfp = new Student("3zfp",100,"ShenZhen")。但无法通过zfp.origName和zfp.FormatIt()方式来访问这两个变量的。
注意以下几点:
1、私有变量是不能用this来指示的。
2、私有方法类型的变量的调用必须是在该方法声明后。如我们将Student类改造如下:
2{
3 var origName = name;
4 this.name = FormatName(name);
5 this.age = age;
6 this.from = from;
7 var FormatName = function(name)
8 {
9 return name+".china";
10 }
11 this.ToString = function()
12 {
13 return "my information is name: "+origName+",age : "+this.age+", from :" +this.from;
14 }
15}
16var zfp = new Student("3zfp",100,"ShenZhen");
代码执行后,将会报"找不到对象"的错误.意思是FormatName()未定义。
3、私有方法无法访问this指示的变量(公开变量),如下:
2function Student(basicinfo)
3{
4 this.basicInfo = basicinfo;
5
6 var FormatInfo = function()
7 {
8 this.basicInfo.name = this.basicInfo.name+".china";
9 }
10 FormatInfo();
11
12}
13function BasicInfo(name,age,from)
14{
15 this.name = name;
16 this.age = age;
17 this.from = from;
18}
19var zfp = new Student(new BasicInfo("3zfp",100,"ShenZhen"));
20
21
执行代码后,系统将会提示 “this.basicInfo为空或不是对象”的错误。
基本结论是,私有方法只能访问私有属性,私有属性在声明并赋值后可以在类的任何地方访问,
实例变量:
实例变量即某个实例对象所拥有的变量。如:
2function BasicInfo(name,age,from)
3{
4 this.name = name;
5 this.age = age;
6 this.from = from;
7}
8var basicA = new BasicInfo("3zfp",100,"ShenZhen");
9basicA.generalInfo = "is 3zfp owned object";
10document.write("basicA's generalInfo is : "+ basicA.generalInfo+"<br>");
11var basicB = new BasicInfo("zfp",100,"ShenZhen");
12document.write("basicB's generalInfo is : "+ basicB.generalInfo+"<br>");
13执行该代码后,我们将可以看到如下结果:
14basicA's generalInfo is : is 3zfp owned object
15basicB's generalInfo is : undefined
16
静态变量:
静态变量即为某个类所拥有的属性,通过 类名+"."+静态变量名 的方式访问该属性。如下可以做清晰的解释:
2{
3 this.name = name;
4 this.age = age;
5 this.from = from;
6}
7BasicInfo.generalInfo = "is 3zfp owned object";
8var basic = new BasicInfo(
相关推荐
本文将从JavaScript权威指南出发,深入探讨变量作用域的相关知识点,包括全局作用域、局部作用域、以及闭包等高级概念。 #### 二、全局作用域与局部作用域 1. **全局作用域** - 定义:在JavaScript中,如果一个...
本文探讨了JavaScript中的变量作用域问题,通过对两种变量的特性从不同角度进行分析和测试,讨论了如何控制变量作用域的有效方法。 变量作用域是JavaScript编程过程中经常遇到的问题之一,对于编程人员来说是一个...
本文将深入探讨JavaScript中的变量作用域,以及它如何影响代码的运行和组织。 首先,我们来理解什么是变量作用域。在JavaScript中,变量作用域决定了变量在何处可以被访问和识别。主要有三种类型的作用域:全局作用...
总结来说,对象的作用域是编程中不可或缺的一部分,它决定了对象的可见性和生命周期。深入理解和熟练掌握对象作用域,能够使我们编写出更加整洁、高效且易于维护的代码。通过对第四章示例代码的学习,开发者将能更好...
变量作用域的定义决定了变量可以被访问的区域,对于理解变量在不同上下文中的访问权限非常重要。 首先,我们要了解JavaScript中的变量有三种声明方式:使用var关键字、let关键字和const关键字。每种声明方式决定了...
JavaScript中的变量作用域是编程时一个至关重要的概念,它决定了变量在何处可被访问以及何时可被访问。这里,我们来深入探讨一下标题和描述中提及的常见错误和理解难点。 1. **全局变量与局部变量** - 全局变量在...
在深入探讨JavaScript变量作用域的知识点之前,我们首先需要了解什么是变量作用域。在编程语言中,作用域定义了变量或函数的可见性和生命周期。作用域决定了代码块内变量的可访问性,以及它们在哪里可用。 ...
本文将深入探讨 JavaScript 的全局作用域和局部作用域,以及相关的变量定义、使用和赋值机制。 1. **全局作用域与局部作用域** - **全局作用域**:这是最大的作用域,它覆盖了整个脚本或网页。在全局作用域中定义...
变量作用域决定了变量在何处可以被访问。主要有以下几种类型的作用域: 1. **全局作用域**:在所有函数外部定义的变量拥有全局作用域,它们在整个程序中都可访问。例如: ```python x = 10 def print_x(): print...
JavaScript是一种广泛应用于网页和网络应用的脚本语言,它的核心特性之一是变量和作用域的概念。在深入探讨这些概念之前,我们先理解一下原始值和引用值的区别。 1、原始值与引用值 JavaScript中有六种原始数据...
Javascript变量作用域是编程中非常基础且重要的一个概念,它决定了代码中变量的可访问性和生命周期。在Javascript中,变量作用域有两个可能会被忽略的小特性,即with语句和try-catch语句对变量作用域的影响,以及...
本文将详细探讨JavaScript回调函数中变量作用域的概念、问题及其解决方案。 #### 二、背景与定义 1. **回调函数**: 是指一个函数作为另一个函数的参数传递进去,并在适当的时候被调用。例如,在进行AJAX请求时,...
全局作用域的变量在整个脚本中都是可访问的,而局部作用域的变量只在其声明的函数或块级作用域内有效。当在函数内部声明变量时,通常会创建局部作用域,而在函数外部声明则产生全局作用域。 了解作用域有助于防止...
JavaScript 变量作用域是编程中的关键概念,它决定了变量在何处可以被访问以及它们的生命周期。在这篇文章中,我们将深入探讨JavaScript中的全局作用域、局部作用域、以及一些特殊情况,如函数内部变量的声明和对象...
在JavaScript中,每个函数都有自己的作用域,决定了变量的可见性和生命周期。全局作用域是最外层,所有未在函数内部声明的变量都属于全局作用域。当在函数内部查找变量时,如果当前作用域找不到,就会向上搜索作用域...
下面我们从多个方面来详细探讨作用域链的概念、作用域链的层级关系、变量访问的性能影响,以及如何通过优化作用域链来提升程序性能。 首先,作用域是编程中一个基本的概念,它决定了变量和函数的可访问范围。在...
在JavaScript中,全局变量是一种可以在整个程序中任何地方访问的变量,它们的作用域跨越函数和代码块。本篇文章将深入探讨JavaScript声明全局变量的几种方法以及如何访问这些变量。 1. **全局变量的声明方式** - ...
JavaScript中的变量作用域是编程中一个至关重要的概念,它决定了变量在何处可被访问以及其生命周期。在这篇文章中,我们将深入探讨JavaScript中的变量作用域,包括它的特点、作用域链、变量优先级以及块级作用域(或...
首先,我们要理解变量作用域。在JavaScript中,主要有两种作用域:全局作用域和局部作用域。 **全局作用域**指的是在整个程序中都可访问的变量。在函数外部声明的变量(使用`var`关键字或在ES6中不使用任何关键字...