Javascript教程(八)變量作用域

Javascript用關(guān)鍵字 var 聲明的變量有函數(shù)作用域全局作用域兩種
Javascript用關(guān)鍵字 let 聲明的變量有塊級作用域
var聲明的變量有變量提升,let沒有變量提升

1. var-函數(shù)作用域
1.1 如果一個變量在函數(shù)體內(nèi)部申明债鸡,則該變量的作用域為整個函數(shù)體江滨,在函數(shù)體外不可引用該變量

function foo() {
    var x = 1;
    x = x + 1;
}

x = x + 2; // ReferenceError! 無法在函數(shù)體外引用變量x

1.2 不同函數(shù)內(nèi)部的同名變量互相獨(dú)立,互不影響.

function foo() {                
    var x = 1;                      //僅在這個函數(shù)體內(nèi)有作用
    x = x + 1;
}                          

function bar() {
    var x = 'A';                     //僅在這個函數(shù)體內(nèi)有作用
    x = x + 'B';
}

1.3 對于嵌套函數(shù)厌均,內(nèi)部函數(shù)可以訪問外部函數(shù)定義的變量唬滑,外部函數(shù)不能訪問內(nèi)部函數(shù)的變量。

function foo() {
    var x = 1;      //外部函數(shù)的變量 x
    function bar() {
        var y = x + 1; // bar可以訪問foo的變量x!
    }
    var z = y + 1; // ReferenceError! foo不可以訪問bar的變量y!
}
function foo() {
    var x = 1;
    function bar() {
        var x = 'A';
        console.log('x in bar() = ' + x); // 'A'
    }
    console.log('x in foo() = ' + x); // 1
    bar();
}
foo();                   //x in foo() = 1          x in bar() = A

說明:JavaScript的函數(shù)在查找變量時從自身函數(shù)定義開始棺弊,從“內(nèi)”向“外”查找晶密。如果內(nèi)部函數(shù)定義了與外部函數(shù)重名的變量,則內(nèi)部函數(shù)的變量將“屏蔽”外部函數(shù)的變量

1.4 變量提升
JavaScript的函數(shù)定義有個特點模她,它會先掃描整個函數(shù)體的語句稻艰,把所有申明的變量“提升”到函數(shù)頂部

function foo() {
    var x = 'Hello, ' + y;                     
    console.log(x);                                //輸出  hello  undefined
    var y = 'Bob';
}
foo();

實際上,JavaScript引擎看到的代碼相當(dāng)于

function foo() {
    var y; // 提升變量y的申明,此時y為undefined
    var x = 'Hello, ' + y;
    console.log(x);
    y = 'Bob';
}

由于JavaScript的這一怪異的“特性”缝驳,我們在函數(shù)內(nèi)部定義變量時连锯,請嚴(yán)格遵守在函數(shù)內(nèi)部首先申明所有變量這一規(guī)則

2. var-全局作用域
不在任何函數(shù)內(nèi)定義的變量就具有全局作用域

    var funcs = []
    for (var i = 0; i < 10; i++) {         //這里在for循環(huán)里定義的 var i 是全局作用域
        funcs.push(function() { console.log(i) })
    }

    funcs.forEach(function(func) {
        func()                                  //結(jié)果是輸出10 十次。
    })

分析:每次for循環(huán)數(shù)組里面加一個函數(shù).執(zhí)行完循環(huán)用狱,i=10,并且最后funcs數(shù)組里面放了10個函數(shù)运怖。
funcs.forEach數(shù)組調(diào)用這個方法,回調(diào)函數(shù)的參數(shù)func就是數(shù)組里面的每個元素夏伊,對數(shù)組里面的每個元素執(zhí)行func() 摇展,相當(dāng)于執(zhí)行數(shù)組元素的函數(shù)體console.log(i) ,所以所有的執(zhí)行都是輸出10

3. let塊級作用域
ES6引入了新的關(guān)鍵字let溺忧,用let替代var可以申明一個塊級作用域的變量

function foo() {
    var sum = 0;
    for (let i=0; i<100; i++) {
        sum += i;
    }
   
    i += 1;    // SyntaxError:僅在for循環(huán)體內(nèi)有作用
}

對比全局作用域的例子

const funcs = []
    for (let i = 0; i < 10; i++) {
        funcs.push(function() {
            console.log(i)
        })
    }
    funcs.forEach(func => func())          //輸出0咏连,1,2鲁森,3祟滴,4,5歌溉,6垄懂,7骑晶,8,9
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末草慧,一起剝皮案震驚了整個濱河市桶蛔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漫谷,老刑警劉巖仔雷,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舔示,居然都是意外死亡碟婆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門斩郎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脑融,“玉大人喻频,你說我怎么就攤上這事缩宜。” “怎么了甥温?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵锻煌,是天一觀的道長。 經(jīng)常有香客問我姻蚓,道長宋梧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任狰挡,我火速辦了婚禮捂龄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘加叁。我一直安慰自己倦沧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布它匕。 她就那樣靜靜地躺著展融,像睡著了一般。 火紅的嫁衣襯著肌膚如雪豫柬。 梳的紋絲不亂的頭發(fā)上告希,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機(jī)與錄音烧给,去河邊找鬼燕偶。 笑死,一個胖子當(dāng)著我的面吹牛础嫡,可吹牛的內(nèi)容都是我干的指么。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涧尿!你這毒婦竟也來了系奉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤姑廉,失蹤者是張志新(化名)和其女友劉穎缺亮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桥言,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萌踱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了号阿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片并鸵。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扔涧,靈堂內(nèi)的尸體忽然破棺而出园担,到底是詐尸還是另有隱情,我是刑警寧澤枯夜,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布弯汰,位于F島的核電站,受9級特大地震影響湖雹,放射性物質(zhì)發(fā)生泄漏咏闪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一摔吏、第九天 我趴在偏房一處隱蔽的房頂上張望鸽嫂。 院中可真熱鬧,春花似錦征讲、人聲如沸据某。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哗脖。三九已至,卻和暖如春扳还,著一層夾襖步出監(jiān)牢的瞬間才避,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工氨距, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留桑逝,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓俏让,卻偏偏與公主長得像楞遏,于是被迫代替她去往敵國和親茬暇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)寡喝,也就是一...
    悟名先生閱讀 4,149評論 0 13
  • 介紹 JavaScript中有一個被稱為作用域(Scope)的特性糙俗。雖然對于許多新手開發(fā)者來說,作用域的概念并不是...
    安_6dd1閱讀 966評論 0 8
  • 目錄 1.靜態(tài)作用域與動態(tài)作用域 2.變量的作用域 3.JavaScript 中變量的作用域 4.JavaScri...
    一縷殤流化隱半邊冰霜閱讀 7,094評論 37 113
  • 結(jié)網(wǎng)猶憑四柱維预鬓,橫行角落幾多時巧骚。 屈伸八爪夸威武,翕合雙牙噴毒洟格二。 風(fēng)雨難消先已遁劈彪,腰身固丑總無知。 常吹大腹經(jīng)綸...
    心硯YCH閱讀 939評論 2 13
  • 在一片茂密的森林里顶猜,烏鴉媽媽和她的孩子過著幸福的生活沧奴。 有一天,森林里著火了长窄,別的鳥嚇得都飛走了滔吠,只有...
    心林心心公主閱讀 450評論 0 0