一、变量
ECMAScrpt中变量是松散类型的,即可以用来保存任何类型的数据,变量自是一个用来保存值得占位符!
1、声明变量用关键字var操作符:
var massage; var i,j;
在未给变凉初始化之前,声明的变量的初始值是undefined;
2、变量的声明及初始化:
var massage=”javascript”;
3、变量的作用域
使用var定义的变量将只在定义该变量作用域内有定义;
全局变量在全局范围有定义,函数内声明的变量只在函数内有定义,函数参数也只在函数内有定义!
故,在函数中定义的变量,在函数返回后,该变量将被销毁!
1 function test(){ 2 var massage='hi';//局部变量 3 } 4 test(); 5 alert(massage);//错误
不过在函数定义变量时,可以省略var从而声明为全局变量!
1 function test(){ 2 massage='hi';//全局变量 3 } 4 test(); 5 alert(massage); // hi
在函数体内,局部变量的优先级高于全局的优先级;如果函数体内的局部变量或函数的参数与全局的变量重名,则全局变量被局部变量覆盖!
1 var scope='global'; 2 function checkscope(){ 3 var scope='local' ; 4 return scope; 5 } 6 checkscope();//local
javascript全局变量是全局对象的属性,这是ECMAScript规范强制规定的,对局部则没有如此规定!
var声明一个变量时,创建的这个属性是不可配置的,无法通过detele运算符删除
如果没有使用严格模式并给一个未声明的变量赋值,javascript会字段创建一个全局变量,
这种方式创建的变量是全局对象可配置属性并可以删除他们:
1 var i=0;//声明一个不可删除的全局变量 2 j=1;//创建全局对象的一个可删除的属性 3 this.k=2;//创建全局对象的一个可删除的属性 4 delete i;//false 5 delete j;//true 6 delete this.k;//true
javaScrpt中没有块级作用域,javascript使用函数作用域,变量在声明他们的函数体及这个函数嵌的任意函数体内都是有定义的!
1 function(o){ 2 var i=0;// 3 if(type o=="Object"){ 4 var j=0;//j在函数体内有定义,不仅仅是在这个代码段内有定义 5 for(var k=0;k<10;k++){//k在函数体内都是有定义的,不仅仅只在循环体内有定义 6 console.log(k);//0~9 7 } 8 console.log(k);//10 9 } 10 console.log(j);//j已经声明,但可能没有初始化
javascrpt的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的,
这意味着在变量声明之前已经可用,javascript的这个特性非正式的成为声明提前;
即javascript函数里的所有变量,声明都被提前到函数顶部,但初始化都留在原来的位置!
1 function(){ 2 var scope; //函数顶部声明变量; 3 console.log(scope);//变量存在,但值为undefined; 4 scope='local';//初始化 5 console.log(scope); 6 7 }