# JavaScript 变量
在编程语言中,变量用于存储数据值。
JavaScript 使用关键字 var 来定义变量, 使用等号来为变量赋值:
var x, length
x = 5
length = 6
变量可以通过变量名访问。在指令式语言中,变量通常是可变的。字面量是一个恒定的值。
# 变量命名规则
变量在 JavaScript 中就是用一个变量名表示,变量名是大小写英文、数字、$
和 _
的组合,且不能用数字开头。变量名也不能是 JavaScript 的关键字,如 if
、while
等。申明一个变量用 var
语句,比如:
var a; // 申明了变量a,此时a的值为undefined
var $b = 1; // 申明了变量$b,同时给$b赋值,此时$b的值为1
var s_007 = '007'; // s_007是一个字符串
var Answer = true; // Answer是一个布尔值true
var t = null; // t的值是null
变量名也可以用中文,但是,请不要给自己找麻烦。
注:JavaScript 中,常见的是驼峰法的命名规则,如 lastName (而不是lastname)。
# JavaScript 是动态语言
在JavaScript中,使用等号 =
对变量进行赋值。可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,但是要注意只能用 var
申明一次,例如:
var a = 123; // a的值是整数123
a = 'ABC'; // a变为字符串
这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如 Java 是静态语言,赋值语句如下:
int a = 123; // a是整数类型变量,类型用int申明
a = "ABC"; // 错误:不能把字符串赋给整型变量
和静态语言相比,动态语言更灵活,就是这个原因。
请不要把赋值语句的等号等同于数学的等号。比如下面的代码:
var x = 10;
x = x + 2;
如果从数学上理解 x = x + 2
那无论如何是不成立的,在程序中,赋值语句先计算右侧的表达式 x + 2
,得到结果12
,再赋给变量 x
。由于 x
之前的值是 10
,重新赋值后,x
的值变成 12
。
# 局部变量和全局变量
# 局部变量
在 JavaScript 函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它。(该变量的作用域是局部的)。
您可以在不同的函数中使用名称相同的局部变量,因为只有声明过该变量的函数才能识别出该变量。
只要函数运行完毕,本地变量就会被删除。
# 全局变量
在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它。
# 局部变量和全局变量的生命周期
JavaScript 变量的生命期从它们被声明的时间开始。
局部变量会在函数运行以后被删除。
全局变量会在页面关闭后被删除。
# 向未声明的变量分配值
如果您把值赋给尚未声明的变量,该变量将被自动作为全局变量声明。
这条语句:
carname="Volvo";
将声明一个全局变量 carname,即使它在函数内执行。
# strict模式
JavaScript 在设计之初,为了方便初学者学习,并不强制要求用 var
申明变量。这个设计错误带来了严重的后果:如果一个变量没有通过 var
申明就被使用,那么该变量就自动被申明为全局变量:
i = 10; // i现在是全局变量
在同一个页面的不同的 JavaScript 文件中,如果都不用 var
申明,恰好都使用了变量 i
,将造成变量 i
互相影响,产生难以调试的错误结果。
使用 var
申明的变量则不是全局变量,它的范围被限制在该变量被申明的函数体内(函数的概念将稍后讲解),同名变量在不同的函数体内互不冲突。
为了修补 JavaScript 这一严重设计缺陷,ECMA 在后续规范中推出了 strict 模式,在 strict 模式下运行的 JavaScript 代码,强制通过 var
申明变量,未使用 var
申明变量就使用的,将导致运行错误。
启用 strict 模式的方法是在 JavaScript 代码的第一行写上:
'use strict';
这是一个字符串,不支持 strict 模式的浏览器会把它当做一个字符串语句执行,支持 strict 模式的浏览器将开启 strict 模式运行 JavaScript。
来测试一下你的浏览器是否能支持 strict 模式:
abc = 'Hello, world';
alert(abc);