A JavaScript identifier must start with a letter, underscore (_), or dollar sign ($) subsequent characters can also be digits (0-9). Because JavaScript is case sensitive, letters include the characters “A” through “Z” (uppercase) and the characters “a” through “z” (lowercase).
Global Scope 全域變數 - 在 function scope(var)和 block scope(let, const) 之外宣告的變數,全域變數在整個程式中都可以被存取與修改。
Local Scope 區域變數 - 在 function scope(var) 和 block scope(let, const) 內宣告,每次執行函式時,就會建立區域變數再予以摧毀,而且函式之外的所有程式碼都不能存取這個變數。
123456789101112
// global scopeletvarOne=1if(true){// local scope, block scopeletvarTwo=2}functiontest(){// local scope, function scopeletvarThree}
variable shadowing
指在某變數可視範圍內,定義了同名變數,在後者的可視範圍中,取用同一名稱時所用的是後者的定義。
12345678910
// global scopeletx=1if(x===1){// local scopeletx=2console.log(x)// 2}console.log(x)// 1
Leaked global
當沒有用 varletconst 宣告時,要取得 global variable 時,找不到會自動 create 一個
123456789
// Example 1: Leaked globalletleakedGlobal=function(){if(true){score=3}console.log(score)}leakedGlobal()console.log(score)// 3
12345678910
// Example 2: No leaked globalletleakedGlobal=function(){letscoreif(true){score=3}console.log(score)}leakedGlobal()console.log(score)// Will throw an error as score wasn't leaked to the global scope
'use strict'a=1// Uncaught ReferenceError: a is not defined
1234567
'use strict'// let data // 加上這行就可以了constprocessData=()=>{data='1230987234'}processData()console.log(data)// Uncaught ReferenceError: data is not defined