Excel宏(JSA)教程——变量
变量是啥?
所有编程语言都有,每种编程语言所代表的含义也大同小异。
什么是变量?
变量是用于存储数据的标识符号。
在Javascript语言环境中怎样理解这个定义呢?
我认为变量就是个容器。
在Javascript中,这个容器一旦被定义出来,什么都可以装。
var i;
//此处定义了一个变量i
这个变量i被定义出来之后,我们后面在使用的时候可以让这个变量等于各种各样的值。
i = 12; //此时这个i表示一个整数
i = 12.5; //此时这个i又代表了一个小数
i = "你好"; //此时这个i又代表了一个字符串
以上三次赋值,都是这个变量i,名称不曾改变,但每次赋值之后,就重新给个变量赋予一个新的意义,每次新的意义被赋予之后就无法再获取上一被赋予的值。
其实大家早就接触过变量,就是我们小学时学过的未知数。
如何定义变量?
Javascript中定义变量有三个关键字:var、let、const
定义变量的语法格式就是:
关键字 变量名;
//例如
var birth;
let name;
const WORK_DAY = 5;
变量的作用范围
啥是变量的作用范围?
顾名思义就是当一个变量被定义出来后,它能被程序访问到的最大范围。
在Javascript中,变量的作用有三种。
1.全局变量
全局变量在整个程序运行的范围内都可以访问。一般是在函数外部定义的变量。
简单说就是全局变量在任何地方都可以访问。
2.局部变量
局部变量只能限定在一个范围内被访问,超出这个范围就无法被访问。通常是在函数内部定义的变量
3.块级变量
块级变量只能在一个语句块中被访问。通常一个语句块指的就是在"{}"之间的语句,在这"{}"之间定义的变量,变只能在这个语句块中被访问。通常是由let定义的变量。
4.直观例子理解变量作用域
var abc;
{
var aaa;
let bbb;
{
let ccc;
bbb=111;//此时不会出错,一级块中定义的变量在二级块中是可发被访问的。
abc=333;//不会出错
}
ccc=222;//此时会出错,因为ccc这个变量只能在上面的大括号范围内访问,超出了就无法访问
}
aaa=0;//不会出错,任何地方都可以被访问
let 定义变量是ECMAScript6新增的,目的就是引入块级变量的概念。在我们后面的学习中,多可看具体情况用let 替代var定义。
var 定义变量带来的问题
1.变量提升
变量提升就是当函数或变量在定义前就被使用了,JS为了确保运行无误,就将其的定义在解释阶段提升到了程序顶部。
也即是未定义先使用,只不过其值是undefined
a=50;
var a;
console.log(a);//此时程序在运行时就发生了变量提升,也即是在给a赋值之时,在系统内部已经定义了一个a,相当于将var a提升到了最顶部,即提升到了a=50这句之前。
2.变量覆盖
var tmp = new Date();
function f() {
console.log(tmp);
if (false) {
var tmp = 'hello world';
}
}
f(); // 得到的结果是undefined
上面的例子,之所以会得到意外的结果,也是因为变量提升所至,然后内部定义的变量又把外面定义的变量给覆盖了。
let定义解决var的问题
let不允许变量或函数在定义变量前使用,所有变量都必须先定义后使用。
let不允许在同一作用域下重复定义同名变量。