烦恼一般都是想太多了。

0%

JS中的变量基础

了解一下基础知识,虽然 JS 很简单,但是经常会造成误解。

变量声明

有三种方式:

  • var
  • let 块作用域变量
  • const 块作用域常量。

其中 块作用域 是在 ECMA 2015 才提出的。之前只有全局作用域和本地作用域两个概念。

变量提升

let/const 在 ECMA6 中不会提升到代码顶部。所以在声明前引用,将会出错。

值的传递

JS 中的变量的引用是引用的形式传递的。一个比较典型的例子就是在闭包中引用全局变量。先看一下全局变量作为参数的例子:

var g = 'GLOBAL';

function test(g){
return function(){ console.log(g)};
}
let fun1 = test(g);

g = 'global';
fun1();

输出会是什么?答案是 GLOBAL

再来看下一个例子:

var g = 'GLOBAL';

function test2(){
return function(){ console.log(g)};
}
let fun2 = test2();

g = 'global';
fun2();

输出是什么?答案是什么 global

从后面一个例子看出,全局变量的变化其实会影响到所有其他引用它的地方。

之所以第一个例子输出的是 GLOBAL 而不是 global 是因为:当把 g 作为参数传递给 test 的时候,test 的本地作用域内会建立一个本地的变量 g,这个时候,引用的就不是全局变量了。所以你改变全局变量的值不会影响它。