摘要:在編譯階段,函數(shù)聲明和變量聲明都會(huì)被先處理置于執(zhí)行環(huán)境的頂部,且賦值會(huì)被留在原地,這個(gè)過程稱之為提升。另外函數(shù)聲明提升不會(huì)被變量聲明覆蓋,但會(huì)被變量賦值覆蓋。
看到相關(guān)的前端面試題,總結(jié)一下知識(shí)點(diǎn),大神請(qǐng)飄過。
JS在編譯階段,函數(shù)聲明和變量聲明都會(huì)被先處理置于執(zhí)行環(huán)境的頂部,且賦值會(huì)被留在原地,這個(gè)過程稱之為提升。
舉個(gè)簡(jiǎn)單例子:
console.log(i); var i = 1; function fn () { console.log(2) }
實(shí)際上代碼順序是這樣的:
function fn () { console.log(2) } var i; console.log(i); i = 1;一、變量提升
變量聲明在編譯階段被處理,而變量賦值則留在原地等待執(zhí)行。
console.log(i); // undefined var i = 1; console.log(i); // 1
相當(dāng)于:
var i; console.log(i); // 由于i只聲明未賦值,輸出undefined i = 1; console.log(i) // i已賦值,輸出1
一道測(cè)試題
var age = 10; function person () { age = 100; console.log(age); // 100 var age; console.log(age) // 100 } person(); console.log(age); // 10二、函數(shù)提升
解析器在解析時(shí)對(duì)函數(shù)聲明與函數(shù)表達(dá)式有著不同的優(yōu)先級(jí),實(shí)際上編譯階段函數(shù)聲明會(huì)先于變量被提升,并使其在執(zhí)行任何代碼之前可訪問,函數(shù)表達(dá)式實(shí)際上是變量聲明的一種,因此函數(shù)聲明提升優(yōu)于函數(shù)表達(dá)式
console.log(fn(1)); // 1 function fn (a) { return a; }
如上面的代碼,由于函數(shù)聲明被置于執(zhí)行環(huán)境頂部,即使調(diào)用函數(shù)的代碼在聲明函數(shù)之前也可以正確訪問。再看函數(shù)表達(dá)式的例子:
console.log(fn(1)); var fn = function (a) { return a; } // 相當(dāng)于 var fn; console.log(fn(1)); fn = function (a) { return a; } // fn is not a function
上面的例子之所以報(bào)錯(cuò),是因?yàn)樽兞縡n聲明后還未對(duì)函數(shù)引用。
另外函數(shù)聲明提升不會(huì)被變量聲明覆蓋,但會(huì)被變量賦值覆蓋。
變量未賦值的例子:
function fn(){ console.log(1); } var fn; console.log(fn); // 由于后一個(gè)fn只聲明未負(fù)值,因此輸出的是函數(shù)fn
變量賦值的例子:
function fn(){ console.log(1); } var fn = function () { console.log(2) }; fn(); // 2 // 相當(dāng)于 function fn(){ console.log(1); } var fn; fn = function () { console.log(2) }; fn(); // 2(因?yàn)槁暶鞯暮瘮?shù)fn被后一個(gè)已引用函數(shù)的變量fn所覆蓋,因此輸出2)
再來點(diǎn):
fn(); var fn = function () { console.log(1); } fn(); function fn () { console.log(2); } var fn; fn(); // 依次輸出2,1,1
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/93196.html
摘要:所謂變量提升,提升就是為了事先聲明變量。變量提升之后,但其賦值還是留在原本的位置等運(yùn)行到了之后動(dòng)態(tài)賦值,而函數(shù)提升之后直接相當(dāng)于在代碼里抽空了。搞明白這個(gè)例子也就搞懂了作用域中變量和函數(shù)是怎么提升的。 問題 showImg(https://segmentfault.com/img/bVJ614?w=222&h=165); 在這個(gè)例子中它應(yīng)該輸出什么?輸出的結(jié)果是6。 showImg(h...
摘要:不同的是函數(shù)體并不會(huì)再被提升至函數(shù)作用域頭部,而僅會(huì)被提升到塊級(jí)作用域頭部避免全局變量在計(jì)算機(jī)編程中,全局變量指的是在所有作用域中都能訪問的變量。 ES6 變量作用域與提升:變量的生命周期詳解從屬于筆者的現(xiàn)代 JavaScript 開發(fā):語法基礎(chǔ)與實(shí)踐技巧系列文章。本文詳細(xì)討論了 JavaScript 中作用域、執(zhí)行上下文、不同作用域下變量提升與函數(shù)提升的表現(xiàn)、頂層對(duì)象以及如何避免創(chuàng)建...
摘要:對(duì)于大多數(shù)開發(fā)者來說,變量提升可以說是一個(gè)非常常見的問題,但是可能很多人對(duì)其不是特別的了解。如果說擁有和一樣的變量提升效果的話,那么應(yīng)該是輸出。而和它們的變量提升的效果是一樣的,也都存在著臨死性死區(qū)的概念。 對(duì)于大多數(shù)js開發(fā)者來說,變量提升可以說是一個(gè)非常常見的問題,但是可能很多人對(duì)其不是特別的了解。所以在此,我想來講一講。 先從一個(gè)簡(jiǎn)單的例子來入門: a = 2; var a; ...
摘要:請(qǐng)注意,就變量生命周期而言,聲明階段與變量聲明是不同的概念。提升在生命周期中無效的原因如上所述,提升是變量在作用域頂部的耦合聲明和初始化階段。然而,生命周期分離聲明和初始化階段。解耦消除了的提升期限。 為了保證的可讀性,本文采用意譯而非直譯。 提升是將變量或函數(shù)定義移動(dòng)到作用域頭部的過程,通常是 var 聲明的變量和函數(shù)聲明function fun() {...}。 當(dāng) ES6 引入l...
摘要:請(qǐng)注意,就變量生命周期而言,聲明階段與變量聲明是不同的概念。提升在生命周期中無效的原因如上所述,提升是變量在作用域頂部的耦合聲明和初始化階段。然而,生命周期分離聲明和初始化階段。解耦消除了的提升期限。 為了保證的可讀性,本文采用意譯而非直譯。 提升是將變量或函數(shù)定義移動(dòng)到作用域頭部的過程,通常是 var 聲明的變量和函數(shù)聲明function fun() {...}。 當(dāng) ES6 引入l...
閱讀 3197·2023-04-26 01:39
閱讀 3351·2023-04-25 18:09
閱讀 1621·2021-10-08 10:05
閱讀 3237·2021-09-22 15:45
閱讀 2784·2019-08-30 15:55
閱讀 2398·2019-08-30 15:54
閱讀 3173·2019-08-30 15:53
閱讀 1331·2019-08-29 12:32