JS红宝书学习-第3章 语言基础 --变量_var

Posted MrChuanlinAndYaFei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS红宝书学习-第3章 语言基础 --变量_var相关的知识,希望对你有一定的参考价值。

3.3 变量-var

ES变量是松散类型的,意思是变量可以用于保存任何类型的数据。每个变量只不过是一个用于保存值得命名占位符。
当前有三个关键字可以声明变量:var,const,let。但是目前只有var可以再任一版本的ES中使用,而const和let只能在ES6及以后的版本使用。

1.var关键字

要定义变量,可以使用var操作符,后面跟变量名,如:
var num;
这行代码定义了一个名为num的变量,可以用来存储任何类型的值。(这个就是上边说的松散类型)在变量不初始化(就是赋值)的情况下会保存一个特殊值undefined。
我们一般使用的时候都会在创建时候同时赋值,如:
var num = 0;
在这里,num被定义为了一个数值为0的变量。
同时上面说的松散类型的另一种体现为,用户可更改已经赋值的变量类型,如:
num = \'0\';
此时把变量num从数值型的0 变为 字符型的\'0\',这样是完全可以的,但是不推荐,其它的开发者在使用时可能不明确类型,然后很困扰,尤其是强类型的语言开发者,由此也诞生出了TS。
不过这也是JS的魅力。有利有弊~

2.声明作用域

有了变量那么变量的作用域。当你声明一个var变量时,var变量会成为包含它的函数的局部变量。当变量在函数退出后会自动销毁,如:
function demo(){
  var num = 0; // demo的局部变量
}
demo(); // 在此行执行完毕后,num会被销毁
console.log(num);// 销毁了,找不到报错

如果不想报错,那么我们的可以省略var操作符,创建一个全局变量:
function demo(){
  num = 0; // 全局变量
}
demo(); // 在此行执行完毕后,num不会被销毁
console.log(num);// 0

虽然省略var会定义为全局变量,但不建议这样做。在局部作用域中定义的全局变量很难维护,而且会给人造成困扰,同时在语法检查器下无法执行,以及严格模式下会抛出错误ReferenceError。

如果想同时定义多个变量,可以在一条语句中使用逗号分隔每个变量,如:
var name = \'张三\', age = 18;

3.声明提升

我们目前知道的变量都是先声明在使用,但是使用var关键字声明时,会提升到作用域顶部,如:
function test(){
  // 提升到了这个地方
  // var num;
  console.log(num);
  var num = 0;	// 此处变量提升
}
test() // undefined
这样本该报错的代码就,就因为这一特性没有报错。

所谓提升(hoist),也就是把所有变量声明都拉到函数作用于的顶部。此外,反复多次使用var声明同一个变量也没有问题:
function test(){
  var num = 0;	// 我声明
  var num = 1;	// 我再声明
  var num = 2;	// 哎,就是玩,就不报错
  console.log(num);
}
test(); // 2

加油。

以上是关于JS红宝书学习-第3章 语言基础 --变量_var的主要内容,如果未能解决你的问题,请参考以下文章

《JavaScript高级程序设计(第四版)》学习笔记第3章(续)

《JavaScript高级程序设计(第四版)》学习笔记第3章

《JavaScript高级程序设计(第四版)》学习笔记第3章

红宝书第8章.BOM

精通javasCRIPT-学习笔记 Features,Functions,Object

红宝书第21章Ajax与Comet