Vue.js 从零开始:var,let,const 傻傻分不清楚

撰写程序的时候,几乎都是用let去撰写,只知道他比var还要安全,不容易出错,更详细的原因,就没办法讲解得很透彻,本篇来复习他们之间的差异性。


var

es6以前传统宣告变数的方法,拥有以下特点:

  1. 允许重复宣告
var demo = '10';
var demo = '100';
console.log(demo);

let demo2 = '10';
let demo2 = '100';
console.log(demo2);
//Uncaught SyntaxError: Identifier 'demo' has already been declared 

多人开发时如果重复变数,新的就会盖掉旧的变数,会造成很多问题,let则不允许同一个block重复宣告变数。

2.不支援区块作用域 (Block Scope)

var y = '100';
function fn(){
  obj:{  
    var x = '10';
  }
  console.log(x);
};

fn();

范例中用var宣告,大括弧外一样可以取用,因为var不支援区块作用域,而是函式作用域。


let

es6 let的几个特性:
1.同一层 Block 无法重复宣告变数

obj: {
  let x = 10;
  let x = 20;
  console.log(x);//Uncaught SyntaxError: Identifier 'x' has already been declared 
}

2.支援区块作用域 (Block Scope)

var y = '100';
function fn(){
  obj: {  
    let x = '10';
    obj2: {
      console.log(x);// "10"
    }
  }
  console.log(x);// ReferenceError: x is not defined
};
fn();

最外层的console.log结果变成 ReferenceError: x is not defined,因为let的特性,此时的作用域只有在自己物件下有效,内层的onj2的console.log(x)结果则是"10"。


const

  1. 同一层 Block 无法重复宣告变数
  2. 支援区块作用域 (Block Scope)
  3. 宣告时需要初始化
    由於常数性质不允许後续再作值的更动,因此宣告的同时就要初始化:
const a = 10;

没有初始化会跳出错误:

const a = 10;

Uncaught SyntaxError: Missing initializer in const declaration
4.後续无法在更改值

const a = 10;
a = 100;//Uncaught TypeError: Assignment to constant variable. 

*补充说明

  • 全域作用域 Global Scope:
    不在函式或区块宣告的变数,可以在任何地方取用,定义变数前没有加上宣告方式,在函式内也会成为全域变数,会污染整个环境,造成开发困难。

  • 区域作用域 Local Scope:

  1. 函式作用域 (Function Scope)
function run(){
  var x = 10;
  console.log(x); //10
};
console.log(x) //x is not defined 

run();

在函式内宣告的变数,只能在自己的函式内使用。

  1. 区块作用域 (Block Scope)
    区块的意思就是大括弧 {},只有在这个大括弧内才可取用。

结论:

var

  • 允许重复宣告
  • 不支援区块作用域 (Block Scope)

let

  • 同一层 Block 无法重复宣告变数
  • 支援区块作用域 (Block Scope)

const

  • 同一层 Block 无法重复宣告变数
  • 支援区块作用域 (Block Scope)
  • 宣告时需要初始化
  • 後续无法在更改值

Kuro重新认识JavaScript
你不可不知的JavaScript 二三事


<<:  与Arduino接起来

>>:  Day 07:测试

Day 30 Python3 + selenium 撷取网站状态快照

Python3 + selenium 撷取网站状态快照 系统更新与软件服务预装 $ sudo apt...

Day 25-Unit Test 应用於 Async Code-1 (情境及应用-5)

Unit Test 应用於 Async Code-1 - 前言 今天的文章内容是参考於 Testin...

DAY 25 Big Data 5Vs – Veracity(准确性) Athena(2)

如同近年被热烈讨论的 微服务架构* 与 CQRS架构*,AWS上推广的资料分析原则之一也是建议要将资...

IF EXISTS (SELECT * FROM table where 1=2)

--哇.这是什麽资料库,我怎麽没这个语法. drop table if exists delme c...

Day 4 该说的还是要先说!

有时候,嗯!没错~有时候吧?某些事情不是只属於你一个人的,而是旁边有人默默的发光照耀着你,就像黑夜里...