JavaScript 核心概念 Scope

Scope is the set of variables, objects, and functions you have access to.
包含 變量,對象和方法

Function Scope Variables 函數(shù)局部作用域變量

在方法內部定義的變量许饿,屬于方法的局部變量阳欲,只能在方法內部訪問。

function f() {
  var foo = 123;
  console.log(foo);
}

f();  // 123

Global Scope Variables 全局作用域變量

在方法外部定義的變量陋率,屬于全局變量球化,在當面頁面中都可以訪問。

var foo = 123;
function f() {
  console.log(foo);
}

f();  // 123

Global and local variables with the same name are different variables. Modifying one, does not modify the other.
兩個變量即使名字相同瓦糟,但如果作用域不同筒愚,也屬于不同的兩個變量。修改只對當前作用域的變量有效菩浙。

Automatically Global 自動全局變量

Variables created without the keyword var, are always global, even if they are created inside a function.
不使用 var 關鍵字創(chuàng)建的變量巢掺,默認為全局變量,即使是在方法內部創(chuàng)建芍耘。

function f() {
  foo1 = 123; // 對未聲明的變量賦值址遇,該變量自動成為全局變量
}

f();

foo2 = 456; // 對未聲明的變量賦值熄阻,該變量自動成為全局變量

console.log(foo1); // 123斋竞,foo1 為全局變量
console.log(foo2); // 456,foo2 為全局變量

use strict

ES5 標準中提出秃殉。

"use strict"; Defines that JavaScript code should be executed in "strict mode".
使得 JavaScript 代碼在嚴格模式下執(zhí)行坝初,例如不能使用未聲明的變量。

'use strict';
foo = 123;
console.log(foo); // ReferenceError: foo is not defined

Block Scope Variables 代碼塊作用域變量

參見 JavaScript ES6 var VS let 區(qū)別

var foo = 5;
for(var i = 1; i <= 3; i++) {
    var foo = i; // Function Scope
}
console.log(foo);  // 3
var foo = 5;
for(var i = 1; i <= 3; i++) {
    let foo = i; // Block Scope
}
console.log(foo);  // 5

Global Variables in HTML

全局范圍是當前 Java Script 的運行環(huán)境钾军,即 window 對象鳄袍,所有全局變量都屬于 window 對象。

var foo = 123;
console.log(window.foo);

Variable Lifetime 變量生命周期

  • 全局作用域變量存在于整個應用程序(your window / your web page)
  • 函數(shù)局部作用域變量生命周期較短吏恭,在函數(shù)調用時創(chuàng)建拗小,函數(shù)調用結束時刪除

一些示例:

var foo = 123;

function f() { 
    var foo = 321;   
    console.log(foo); // 先在當前 function scope 去找 foo,如果找不到樱哼,再去上一層 global scope 去找 foo
}

f(); // 321
var foo = 123;

function f() { 
    var foo = 321;
}

f();
console.log(foo);  // 123哀九,在當前 global scope 去找 foo

Hoisting

Hoisting is JavaScript's default behavior of moving declarations to the top.
自動將變量的聲明移動到頭部,即變量可以先使用搅幅,再聲明阅束。

例如,如下的兩段代碼等價:

'use strict';
foo = 123;
console.log(foo); // 123
var foo; // 自動將變量的聲明移動到頭部
'use strict';
var foo;
foo = 123;
console.log(foo); // 123

Hoisting 也適用于方法茄唐,即方法可以先使用息裸,再聲明。 例如:

'use strict';
f(); // 123

function f() {
  console.log(123);
}

JavaScript Initializations are Not Hoisted 初始化不能被 Hoisted

例如:

'use strict';
console.log(foo); // undefined
var foo = 123; // 初始化不能被 Hoisted

函數(shù)嵌套的 Scope

In JavaScript, all functions have access to the scope "above" them.
所有的函數(shù)都能訪問上一層的 Scope。

例如:

function f1() {
  var i = 0;
  
  function f2() {
    i = 1; // 函數(shù)都能訪問上一層的 Scope
  }
  
  f2();
  
  console.log(i);
}

f1(); // 1

引用:
JavaScript Scope
JavaScript Hoisting

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末呼盆,一起剝皮案震驚了整個濱河市年扩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌访圃,老刑警劉巖常遂,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異挽荠,居然都是意外死亡克胳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門圈匆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漠另,“玉大人,你說我怎么就攤上這事跃赚“蚀辏” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵纬傲,是天一觀的道長满败。 經常有香客問我,道長叹括,這世上最難降的妖魔是什么算墨? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮汁雷,結果婚禮上净嘀,老公的妹妹穿的比我還像新娘。我一直安慰自己侠讯,他們只是感情好挖藏,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厢漩,像睡著了一般膜眠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溜嗜,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天宵膨,我揣著相機與錄音,去河邊找鬼粱胜。 笑死柄驻,一個胖子當著我的面吹牛,可吹牛的內容都是我干的焙压。 我是一名探鬼主播鸿脓,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼抑钟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了野哭?” 一聲冷哼從身側響起在塔,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拨黔,沒想到半個月后蛔溃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡篱蝇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年贺待,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片零截。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡麸塞,死狀恐怖,靈堂內的尸體忽然破棺而出涧衙,到底是詐尸還是另有隱情哪工,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布弧哎,位于F島的核電站雁比,受9級特大地震影響,放射性物質發(fā)生泄漏撤嫩。R本人自食惡果不足惜偎捎,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望非洲。 院中可真熱鬧鸭限,春花似錦蜕径、人聲如沸两踏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梦染。三九已至,卻和暖如春朴皆,著一層夾襖步出監(jiān)牢的瞬間帕识,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工遂铡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肮疗,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓扒接,卻偏偏與公主長得像伪货,于是被迫代替她去往敵國和親们衙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容

  • 原文:http://dmitrysoshnikov.com/ecmascript/javascript-the-c...
    jaysoul閱讀 478評論 0 0
  • 你知道如下的JavaScript代碼被執(zhí)行后碱呼,會彈出什么蒙挑? var foo = 1; function bar()...
    花括弧閱讀 228評論 0 0
  • FreeCodeCamp - Basic JavaScript 寫在前面: 我曾經在進谷前刷過這一套題,不過當時只...
    付林恒閱讀 16,445評論 5 28
  • 作者:Dmitry A. Soshnikov編譯地址:http://dmitrysoshnikov.com/ecm...
    IT程序獅閱讀 3,341評論 2 12
  • 把愛帶回家愚臀,為什么想到這個話題忆蚀,前幾天坐公交回學校的路上,聽見一個女孩唱起了這首歌姑裂,嘻嘻馋袜,還記得嗎?小時候經常在電...
    小鹿Deerlet閱讀 642評論 0 4