`

1、变量定义、作用域

阅读更多
  • 前言

      JavaScript也许对我们搞WEB企业开发人员来说是很熟悉了,但又有几个人真真的学习过他、了解过它呢,可能因为以下种种原因吧,一是可能是太简单了,平时只用它来写点表单的验证,充其量用它来操纵BOM(BOM是什么,请看《JavaScript实现》 )而已;二是可能是我们用得不是很深(一点表单校验吧),也可能是没有太多的时间再去学它(比如我?或许是借口吧?),也可能是...

 

以前一直没有真真的去学过它,但也曾想过认真的学习一遍,毕竟很常用吧。说到这里,我感到很羞愧,做为一个几年WEB开的人员,还一直认为JScript就是我们平时讲到的JavaScript呢(不知道的请看《JavaScript的历史》 )!也直到前不久看到《悟透JavaScript》 一贴(后面等有空时转载过来认真真的看它一遍),才恍然大悟,JavaScript原来这么大的艺术魅力... 所以现决定从头看一下,好好的熟悉熟悉一下,再说随着互连网的飞速发展,WEB技术中肯定缺少不了它,从N年前到现在还在流行的Ajax就可能出它的魅力了。

 

好了,还是开始学习点吧,不然老了就学不了,毕竟人的精力与生命是有限的。这里我会把学习过程中较易容出错又较重要的都记录下来并贴于此,供N年后快速查阅。先准备参考《W3Shool手册》,然后是《JavaScript权威指南》,最后就是《JavaScript高级程序设计》。

 

这里还是从ECMAScript学起吧,毕竟他才是规范,学嘛,当然要学标准的。

  • ECMAScript 变量

变量定义

ECMAScript 中的变量是用 var 运算符(variable 的缩写)加变量名定义的。

var test = "hi";

ECMAScript 是弱类型的,所以解释程序会为 test 自动创建一个字符串值,无需明确的类型声明。

用同一个 var 语句定义的变量不必具有相同的类型,如下所示:

var test = "hi", age = 25;

ECMAScript 中的变量并不一定要初始化。

变量可以存放不同类型的值 。例如,可以把变量初始化为 字符串类型的值,之后把它设置为数字值,如下所示:

var test = "hi";
alert(test);
test = 55;
alert(test);

 

命名变量

变量名需要遵守两条简单的规则:

 

第一个字符必须是字母、下划线(_)或美元符号($)

余下的字符可以是下划线、美元符号或任何字母或数字字符

 

 变量声明不是必须的

var sTest = "hello ";
sTest2 = sTest + "world";//此变量未声明
alert(sTest2);


ECMAScript 的解释程序遇到未声明过的标识符时,用该变量名创建一个全局变量,并将其初始化为指定的值。

 

 变量作用域

ECMAScript中只存在一种作用域——公用作用域 。ECMAScript中的所有对象的所有属性和方法都是公用的。
严格说来,ECMAScript并没有静态作用域 。不过,它可以给构造函数提供属性和方法。构造函数只是函数。函数是对象,对象可以有属性和方法 。例如:
function sayHi(){
alert('hi');
}
sayHi.alternate = function(){
alert('hola');
}
sayHi();//hi
sayHi.alternate();//bola

这里,方法alternate()实际上是函数sayHi的方法。可以像调用常规函数一样调用sayHi()输出"hi",也可以调用 sayHi.alternate()输出"hola"。即使如此,alternate()也是sayHi()公用作用域中的方法,而不是静态方法。

 

JavaScript变量作用域特点:

  •    JavaScript的变量作用域是基于其特有的作用域链的。 
  •    JavaScript没有块级作用域(只有函数级作用域)。
  •    函数中声明的变量在整个函数中都是有效的。 

1、变量作用域是基于其特有的作用域链的

<script type="text/javascript" language="javascript">   
  
var rain = 1;   
function rainman(){   
    var man = 2;   //注:函数内定义的变量只能在该函数内使用,不能在函数外调用,
                           //所以变量的作用域是函数级的    
    function inner(){   
        var innerVar = 4;   
        alert(rain);   
    }   
    inner();      
}   
rainman();     
  
</script>  

 

观察alert(rain);这句代码。JavaScript首先在inner函数中查找是否定义了变量rain,如果定义了则使用inner函数中的rain变量;如果inner函数中没有定义rain变量,JavaScript则会继续在rainman函数中查找是否定义了rain变量,在这段代码中rainman函数体内没有定义rain变量,则JavaScript引擎会继续向上(全局对象)查找是否定义了rain;在全局对象中我们定义了rain = 1,因此最终结果会弹出'1'。

作用域链:JavaScript需要查询一个变量x时,首先会查找作用域链的第一个对象,如果以第一个对象没有定义x变量,JavaScript会继续查找有没有定义x变量,如果第二个对象没有定义则会继续查找,以此类推。

上面的代码涉及到了三个作用域链对象,依次是:inner、rainman、window。

 

2、函数体内部,局部变量的优先级比同名的全局变量高 

<script type="text/javascript" language="javascript">   
  
var rain = 1;    //定义全局变量 rain   
function check(){   
    var rain = 100;    //定义局部变量rain   
    alert( rain );    //这里会弹出 100   
}   
check();   
alert( rain );    //这里会弹出1   
  
</script>  

 

3、JavaScript没有块级作用域 

<script type="text/javascript" language="javascript">   
  
function rainman(){   
/**  
 * rainman函数体内存在三个局部变量 i j k,它们的作用域是相同的,且在整个rain函数体内都是全局的。 
 */  
    var i = 0;   
    if( 1 ){   
        var j = 0;   
        for( var k = 0 ; k < 3 ; k++ ){   
            alert( k );    //分别弹出 0 1 2   
        }   
        alert( k );    //弹出3   
    }   
    alert( j );    //弹出0   
}   
  
</script>  

 

4、内层函数声明的变量会隐藏掉外层函数相同变量的声明 

<script type="text/javascript" language="javascript">   
  
function outer(){
	var x = 1;   
	function rain(){   
		alert( x );    //弹出 'undefined',而不是1   
		var x = 'rain-man';   //隐藏函数外层相同变量的声明
		alert( x );    //弹出 'rain-man'   
	}   
	rain();  
	alert(x); //弹出 '1'  只会在rain方法里隐藏变量的声明,在函数外还是用外层声明的变量
}
outer();
  
</script>  

 

这是由于在函数rain内局部变量x在整个函数体内都有定义( var x= 'rain-man',进行了声明),所以在整个rain函数体内隐藏了同名的全局变量x。这里之所以会弹出'undefined'是因为,第一个执行alert(x)时,局部变量x仍未被初始化。


5、未使用var关键字定义的变量都是全局变量 

<script type="text/javascript" language="javascript">   
	function rain(){   
		x = 100;    //声明了全局变量x并进行赋值   
	}   
	//alert(x); 	//运行会出错,在调用rain方法之前,x未声明,因为
				//未声明的任何变量除了可以typeof操作外的任何操作都是不允许的
	rain();   
	alert( x );    //会弹出100   
</script> 

  这也是JavaScript新手常见的错误,无意之中留下的许多全局变量。

 

6、全局变量都是window对象的属性 

<script type="text/javascript" language="javascript">   
	var x = 100 ;   
	alert( window.x );     //弹出100   
	alert('x' in window);   //进一步证明全局变量为window的属性
</script>  

 

等同于下面的代码

<script type="text/javascript" language="javascript">   
	window.x = 100;   
	alert( window.x );   
	alert(x);   
</script>  

原帖地址:http://www.cnblogs.com/rainman/archive/2009/04/28/1445687.html

分享到:
评论

相关推荐

    函数的全局和局部作用域和变量-作用域.html

    // 局部变量:在函数作用域之间里的一个或者多个函数或者作用域,在局部作用域中定义的变量 局部变量。只有在该作用域内可以访问 // 局部作用域:任何一个函数的内部都有一个局部作用域,在局部作用域中定义的...

    javascript变量作用域

    JavaScript 首先在当前作用域中查找变量,如果没有定义,则会继续查找上一层作用域,直到找到全局对象。在上面的代码中,我们定义了一个全局变量 rain,并在 rainman 函数中调用 inner 函数, inner 函数中没有定义 ...

    java变量的生命周期与作用域

    方法作用域是指变量定义在方法内部的作用域,块作用域是指变量定义在块内部的作用域,类作用域是指变量定义在类内部的作用域,而实例作用域是指变量定义在实例内部的作用域。 在 Java 中,变量的生命周期和作用域是...

    js变量作用域

    在JavaScript中,局部变量是指在某个函数或块级作用域内定义的变量,其可见范围仅限于该函数或块。如果在一个函数内部不使用`var`、`let`或`const`声明变量,则该变量会自动提升为全局变量。 **示例代码**: ```...

    深入理解变量作用域

    - 定义:在JavaScript中,如果一个变量在任何函数外部声明,则该变量处于全局作用域下。这意味着它可以在程序的任何地方被访问。 - 特性: - 全局变量在整个程序运行期间都是可用的。 - 当一个变量被声明但未被...

    PHP函数 -变量的作用域.ppt

    * PHP函数 -----变量的作用域 课程内容 局部变量 全局变量 静态变量 变量的作用域 变量需要先定义后使用,但这并不意味着变量定义后就可以随便使用,只有在它的作用范围中才可以被使用,这个作用范围称为变量的作用...

    Java程序设计基础:变量的作用域.pptx

    变量的作用域 目录 课程导入 理解变量作用域的概念 理解局部变量与全局变量的区别及作用域 能区分局部变量与全局变量,并读懂程序 变量的作用域(scope of a variable) 就指变量在程序中可以被引用的范围。 变量的...

    python中变量作用域及嵌套作用域.pdf

    例如,使用 def 语句可以定义一个函数,并在函数内部定义一个变量,这样该变量的作用域将被限制在函数内部。 变量搜索路径是:本地变量-&gt;全局变量,Python 会按照这个顺序来查找变量。如果找不到变量,将抛出异常。...

    作用域的定义及应用

    **局部变量**是指在函数内部定义的变量,其作用域限制在定义它的函数体内。这意味着,一旦函数执行完毕,这些变量就会被销毁,其生命周期与函数的执行周期相同。例如: ```c void func1() { int x; x = 10; // ...

    C语言、变量和函数的作用域与生存期

    3. **extern**:用于声明全局变量,表明变量定义在其他地方,或者扩展一个已经定义的全局变量的作用域。 4. **static**:用于创建静态生存期的变量。当用于全局变量时,限制其作用域仅限于当前源文件;当用于局部...

    C++基础--变量的作用域和存储区

    外部变量(在函数外部定义,无`static`关键字)的生命周期与程序相同,但作用域仅限于定义它的文件,除非通过`extern`声明。寄存器变量如前述,试图存储在CPU寄存器中以优化性能。 总的来说,理解和掌握C++中的变量...

    PHP变量的定义及作用域

    理解变量定义和作用域对于编写高效、可维护的PHP代码至关重要。正确地管理变量的作用域可以避免命名冲突,提高代码的清晰度,同时减少潜在的错误。在实际编程中,应尽可能减少全局变量的使用,因为它们可能会导致...

    变量的作用域.zip

    在C++中,如果一个变量在任何函数外部定义,但不在全局作用域(即不在任何命名空间或类中),则它具有文件作用域,可被同一源文件中所有函数访问。 5. **命名空间(Namespace)作用域**: C++引入命名空间来避免...

    基于JavaScript的变量作用域的辨析.pdf

    函数作用域可以将变量定义在函数体内部,避免与全局变量混淆。闭包可以将变量定义在函数体内部,并且可以访问外部变量。 变量作用域是JavaScript编程过程中一个重要的问题,需要进行缜密的判断和处理。控制变量作用...

    JAVA程序设计课件-变量的作用域.pptx

    在JAVA中,变量通常被定义在某个代码块内,如类、方法或循环体中,这些大括号`{}`内的代码段就构成了变量的作用域。一旦变量超出其定义的大括号范围,它就无法再被访问,从而失去作用。\n\n例如,如果一个变量在方法...

    变量作用域

    C语言入门经典中的例程,程序简单明了的介绍了变量的作用域,循环外定义变量和循环内定义变量的区别

    c++if语句、决策语句块和变量作用域

    1. **局部作用域(Local Scope):** 在函数或复合语句中定义的变量只能在其定义的范围内访问。 2. **块作用域(Block Scope):** 在`{}`括号内的变量只能在该块内访问。 3. **文件作用域(File Scope):** 在所有...

    python中变量作用域及嵌套作用域.docx

    1. **局部作用域**:指的是在函数内部定义的变量的作用域。这些变量只能在该函数内部被访问。 2. **外部作用域**:当一个函数内部又定义了另一个函数时,内部函数可以访问外部函数中定义的变量,这种作用域称为外部...

    c#从入门到实践; 示例 使用变量记录用户的登录名;变量的作用域

    1. **全局作用域**:在所有函数和类之外声明的变量具有全局作用域,它们在整个程序中都可见,但通常建议避免过多使用全局变量,因为这可能导致代码混乱。 2. **局部作用域**:在函数内部声明的变量是局部的,它们只...

    C语言中变量的作用域.pdf

    总之,C语言中的变量作用域定义了变量的可见性和生命周期,合理使用变量可以提高代码的可读性和可维护性。同时,对网络安全的管理以及办公自动化的应对策略也是现代信息技术领域不可忽视的问题。

Global site tag (gtag.js) - Google Analytics