JS作用域鏈

作用域問題

JavaScript語言的作用域僅存在于函數(shù)范圍中掠抬。這是必須要牢記的一點(diǎn),還有一點(diǎn)重要的就是作用域的提升規(guī)則校哎。

作用域問題

JS最容易出現(xiàn)混淆的就是作用域的情況两波。對于JavaScript而言,它的作用域是函數(shù)域闷哆,比如if條件語句腰奋,就不算一個(gè)獨(dú)立的作用域:

var x = 1;
console.log(x); // 1
if (true) {
    var x = 2;
    console.log(x); // 2
}
console.log(x); // 2

在JavaScript中,可以通過立即執(zhí)行函數(shù)創(chuàng)建臨時(shí)作用域:

function foo() {
    var x = 1;
    if (x) {
        (function () {
            var x = 2;
            // some other code
        }());
    }
    // x is still 1.
}

作用域鏈問題

函數(shù)會(huì)在當(dāng)前作用域?qū)ふ宜淖兞勘д绻麤]有就在上一級尋找劣坊,一直找到最外層

作用域提升

變量被提升

對JavaScript解釋器而言,所有的函數(shù)和變量聲明都會(huì)被提升到最前面, 并且變量聲明永遠(yuǎn)在前面屈留,賦值在聲明過程之后局冰。比如:

var x = 10;
function x(){};
console.log(x); // 10

實(shí)際上被解釋為:

var x;
function x(){};
x = 10;
console.log(x); // 10

函數(shù)被提升

函數(shù)的聲明方式主要由兩種:聲明式和變量式。

聲明式會(huì)自動(dòng)將聲明放在前面并且執(zhí)行賦值過程灌危。而變量式則是先將聲明提升康二,然后到賦值處再執(zhí)行賦值。比如:

function test() {
    foo(); // TypeError "foo is not a function"
    bar(); // "this will run!"
    var foo = function () { // function expression assigned to local variable 'foo'
        alert("this won't run!");
    }
    function bar() { // function declaration, given the name 'bar'
        alert("this will run!");
    }
}
test();

實(shí)際上等價(jià)于:

function test() {
    var foo;
    var bar;
    bar = function () { // function declaration, given the name 'bar'
        alert("this will run!");
    }

    foo(); // TypeError "foo is not a function"
    bar(); // "this will run!"

    foo = function () { // function expression assigned to local variable 'foo'
        alert("this won't run!");
    }
}
test();

主要注意的地方:帶有命名的函數(shù)變量式聲明勇蝙,是不會(huì)提升到作用域范圍內(nèi)的沫勿,比如:

var baz = function spam() {};
baz(); // vaild
spam(); // ReferenceError "spam is not defined"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子产雹,更是在濱河造成了極大的恐慌诫惭,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔓挖,死亡現(xiàn)場離奇詭異夕土,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)时甚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門隘弊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哈踱,“玉大人荒适,你說我怎么就攤上這事】停” “怎么了刀诬?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長邪财。 經(jīng)常有香客問我陕壹,道長,這世上最難降的妖魔是什么树埠? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任糠馆,我火速辦了婚禮,結(jié)果婚禮上怎憋,老公的妹妹穿的比我還像新娘又碌。我一直安慰自己,他們只是感情好绊袋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布毕匀。 她就那樣靜靜地躺著,像睡著了一般癌别。 火紅的嫁衣襯著肌膚如雪皂岔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天展姐,我揣著相機(jī)與錄音躁垛,去河邊找鬼。 笑死圾笨,一個(gè)胖子當(dāng)著我的面吹牛教馆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播墅拭,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼活玲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舒憾,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤镀钓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后镀迂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丁溅,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年探遵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窟赏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡箱季,死狀恐怖涯穷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情藏雏,我是刑警寧澤拷况,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站掘殴,受9級特大地震影響赚瘦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奏寨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一起意、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧病瞳,春花似錦揽咕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笼踩,卻和暖如春逗爹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嚎于。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工掘而, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人于购。 一個(gè)月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓袍睡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肋僧。 傳聞我的和親對象是個(gè)殘疾皇子斑胜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

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

  • 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別控淡? 1.聲明的函數(shù)foo將會(huì)在執(zhí)行前提升,因此foo在函數(shù)上下文都是可以被調(diào)用的止潘,即...
    小囧兔閱讀 301評論 0 1
  • 一掺炭、作用域 一個(gè)變量的作用域(scope)是程序源代碼中定義的這個(gè)變量的區(qū)域。 在JS中使用的是詞法作用域(lex...
  • 之前寫過一篇JavaScript 閉包究竟是什么的文章理解閉包凭戴,覺得寫得很清晰涧狮,可以簡單理解閉包產(chǎn)生原因,但看評論...
    寧驥閱讀 335評論 0 1
  • 貧道么夫,感覺者冤,JS的坑,不是一般地大档痪。 變量提升: 變量提升( hoisting )涉枫。 我可恨的 var 關(guān)鍵字: ...
    挺哥1998閱讀 992評論 0 1
  • 第 1 題 立即執(zhí)行函數(shù)表達(dá)式是什么?有什么作用钞它? 1. 立即執(zhí)行函數(shù)是什么 立即執(zhí)行函數(shù)就是 聲明一個(gè)匿名函數(shù) ...
    紅豆丁244閱讀 393評論 0 0