5. 变量
变量定义
变量是用于存储信息的”容器”。
JavaScript 的变量可以用来保存任何类型的数据。
变量命名规则:
•变量必须以字母开头
•变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做)
•变量名称对大小写敏感(y 和 Y 是不同的变量)
var i = 0;
var sum;
var msg = "hello";
var arr = [1,2,3];
变量声明
定义变量时要使用关键字 var 来声明的:
var i;
var sum;
也可以通过一个var关键词来声明多个变量:
var i,sum;
还可以将变量的初始赋值和变量声明合写在一起:
var message = "hello";
var i = 0, j = 0;
使用var语句重复声明变量是合法且无害的。如果重复声明带有初始化,那么这就和一条简单的赋值语句没什么两样。
在ECMAScript 5 严格模式中,如果尝试读取一个没有声明的变量的值,Javascript会报错。
在非严格模式下,如果给一个未声明的变量赋值,相当于声明了一个全局变量(可用delete删除,用var声明的不可删除),但这是一个不好的习惯并会造成很多bug,因此,你应该始终用var来声明变量。
function test(){
var message = "hello"; // 局部变量
}
test();
console.log(message); // 产生错误
function test(){
message = "hello"; // 全部变量
}
test();
console.log(message); // hello
变量作用域
作用域:一个变量的作用域(scope)是程序源代码中定义这个变量的区域。
全局变量:全局变量拥有全局作用域,在Javascript代码中的任何颠覆都是有定义的。
局部变量:然而在函数内声明的变量只能在函数体内有定义,它们是局部变量,作用域是局部性的。函数参数也是局部变量,它们只能在函数体内有定义。
在函数体内,局部变量的优先级高于同名的全局变量。 如果在函数内声明的一个局部变量,那么全局变量就被局部变量所覆盖。
var scope = "global"; // 声明一个全局变量
function checkscope(){
var scope = "local"; // 声明一个同名的局部变量
return scope; // 返回局部变量的值,而不是全局变量的值
}
checkscope(); // “local”
函数定义是可以嵌套的,由于每个函数都与它自己的作用域,因此会出现几个局部作用域嵌套的情况,例如:
var scope = "global scope"; //全局变量
function checkscope(){
var scope = "local scope"; //局部变量
function nested(){
var scope = "nested scope"; //嵌套作用域内的局部变量
return scope; //返回当前作用域内的值
}
return nested();
}
checkscope(); // nested scope
函数作用域和声明提前
在类似C语言的编程语言中,花括号({ })内的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的,我们称为块级作用域(block scope)。
Javascript中没有块级作用域。Javascript取而代之地使用了函数作用域(function scope):变量在声明它们的函数体内以及整个函数体嵌套的任意函数体内都是有定义的。
function test(id){
var i = 0; // i 在整个函数体内都有定义
if(typeof id == "object"){
var j = 0; // j 在函数体内都有定义,不仅仅是在这个代码段内
for(var k=0; k<10;k++){ // k 在函数体内都有定义,不仅仅是在循环内
console.log(k); // 输出数字0-9
}
console.log(k); //k已经定义了,输出10
}
console.log(j); //j已经定义了,输出0
}
Javascript函数里声明的所有变量(但不涉及赋值)都被“提前”至函数整体的顶部。
var scope = "global";
function foo(){
console.log(scope); //输出undefined,而不是"global"
var scope = "local";
console.log(scope); //输出"local"
}