junJZ_2008 发表于 2013-1-23 02:40:52

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
页: [1]
查看完整版本: 1、变量定义、作用域