摘要:作用域是代碼的不同部分在運(yùn)行期間的可見性。大多數(shù)開發(fā)者想當(dāng)然地理解作用域,但毫無疑問,有它自己的說明。變量可能是全局作用域的,或者是方法作用域的??偠灾?,不要重復(fù)聲明變量,使用良好命名,盡力避免在聲明前調(diào)用和執(zhí)行任何東西。
原文鏈接:https://hackernoon.com/unders...
什么是作用域?就像JavaScript中的其他東西一樣,作用域并無特別之處。盡管大多數(shù)開發(fā)者并不會(huì)在上面太多時(shí)間,不過,深入理解作用域有助于你寫更干凈的應(yīng)用,也有助于降低錯(cuò)誤和實(shí)現(xiàn)更好的設(shè)計(jì)模式。
作用域是代碼的不同部分在運(yùn)行期間的可見性。
大多數(shù)開發(fā)者想當(dāng)然地理解作用域,但毫無疑問,JavaScript有它自己的說明。變量可能是全局作用域的,或者是方法作用域的。這也就意味著,變量存在于任何地方都能被訪問的全局,或者存在于聲明它們的方法之內(nèi)。
var global = "I am global scoped" function testingFunctionScope() { var global = "I am function scoped"; console.log(global); // I am function scoped } testingFunctionScope(); console.log(global); // I am global scoped
正如你在例子中看到的那樣,盡管全局變量在方法內(nèi)被賦予一個(gè)不同的值,但它只保存在這個(gè)方法中。在方法外面,那個(gè)變量有一個(gè)不同的值---在全局作用域聲明的值。
var global = "global" var anotherGlobal = "also global" function functionScope () { var global = "function scope" console.log(global) // function scope var scoped = "also function scope" function inner () { console.log(scoped); // also function scope console.log(anotherGlobal) // also global } inner(); } console.log(global) // global console.log(anotherGlobal) // also global console.log(scoped) // ReferenceError functionScope(); inner(); // ReferenceError
這是一個(gè)擁有內(nèi)部函數(shù)的例子,并展示了它如何訪問父作用域的變量。正如父函數(shù) functionScope()那樣 ,它內(nèi)部聲明的每個(gè)變量只在其內(nèi)部和它的內(nèi)部函數(shù)中有效。
注意:絕對(duì)不要使用未聲明的變量 如果那樣做了,引擎會(huì)冒泡到父作用域?qū)ふ掖俗兞?。如果尋之不得,js會(huì)為你聲明一個(gè)。這樣你無意之中就創(chuàng)建了一個(gè)全局變量并擾亂了全局作用域。
另外,未定義和未聲明不是同一件事情。未定義:聲明了一個(gè)變量但沒有賦值,未聲明:變量根本還沒有被聲明。
好了,到目前為止,沒有什么特別之處,且看下面代碼如何返回:
test(); // ??? function test() { console.log("working?!"); }
驚不驚喜?確實(shí)打印出了 working?!。為了理解其中緣由我們必須探求JavaScript另一個(gè)概念。
變量提升在此我將不同于他人,我會(huì)描述什么是變量提升并解釋其弊端。困惑?好-Javascript就應(yīng)該困惑。變量提升這種奇怪的行為,意味著你可以在方法聲明前調(diào)用它。
在JavaScript中,代碼執(zhí)行之前變量和方法會(huì)被移至頂端。所以上面奇怪的代碼判斷,實(shí)際上變成:
function test() { console.log("working?!"); } test(); // working?!
因此,我們寫的和實(shí)際執(zhí)行的并不一致。變量定義也是一樣---它們都會(huì)提升到自己作用域的頂部(用var關(guān)鍵字聲明的會(huì);用let聲明的則不會(huì))。變量的聲明會(huì)提升,賦值并不會(huì)。所以如果我們?cè)谝粋€(gè)變量賦之前使用它,得到的是undifined,并不是錯(cuò)誤
var test; console.log(test) // undefined test = "working?" console.log(test) // working?
所以使用函數(shù)表達(dá)式的時(shí)候千萬小心,因?yàn)橹挥泻瘮?shù)的聲明提升了。我們現(xiàn)在對(duì)JavaScript中的的作用域和變量提升有了基本的理解,實(shí)際上兩者有很大不同。JS代碼的整個(gè)執(zhí)行過程非常不同,并且變量提升也并非大多說人所想。這更多的是我們持有的精神概念。
編譯出乎意料,JavaScript確實(shí)需要編譯。V8引擎在執(zhí)行前通過將JavaScript編譯成本地機(jī)器碼而不是執(zhí)行字節(jié)碼或解釋它來提升性能。實(shí)際上引擎會(huì)多線程運(yùn)行代碼。其中一個(gè)線程,負(fù)責(zé)聲明所有方法和變量,所以在運(yùn)行時(shí)都已存在。雖然解釋編譯過程更加簡單,對(duì)于變量提升我們創(chuàng)建了在代碼運(yùn)行前如何組織代碼的思維導(dǎo)圖。
簡言之---在JS代碼實(shí)際執(zhí)行前,引擎已經(jīng)運(yùn)行了整個(gè)腳本并在它們的作用域中聲明了所有的變量和方法。所以在運(yùn)行時(shí),它們已經(jīng)存在,變量提升并非什么黑魔法。如果你理解了這個(gè),你就超過了其他90%的JavaScript開發(fā)者。
總結(jié)JavaScript的作用域還有很多需要學(xué)習(xí)。為了縮短篇幅讓大家有個(gè)基本的理解,我甚至都沒有提LHS和RHS。如果你搞不清楚你所做的事情,JavaScript絕對(duì)驚喜多多(bug?。???偠灾灰貜?fù)聲明變量,使用良好命名,盡力避免在聲明前調(diào)用和執(zhí)行任何東西。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94971.html
摘要:當(dāng)面試中讓我解釋一下閉包時(shí)我懵逼了。這個(gè)解釋開始可能有點(diǎn)晦澀,讓我們抽絲剝繭摘下閉包的真面目。此文不詳述作用域有專門的主題闡述,不過作用域是理解閉包原理的基礎(chǔ)。這才是閉包的真正便利之處。閉包使用不當(dāng)就會(huì)很坑。 原文鏈接 為什么深度學(xué)習(xí)JavaScript? JavaScript如今是最流行的編程語言之一。它運(yùn)行在瀏覽器、服務(wù)器、移動(dòng)設(shè)備、桌面應(yīng)用,也可能包括冰箱。無需我舉其他再多不相干...
摘要:比如,我們可以監(jiān)聽事件由實(shí)例發(fā)出,然后在任何瀏覽器中就是變化的時(shí)候都會(huì)得到通知,如下所示每一個(gè)作用域?qū)ο蠖紩?huì)有這個(gè)方法,可以用來注冊(cè)一個(gè)作用域事件的偵聽器。這個(gè)函數(shù)所扮演的偵聽器在被調(diào)用時(shí)會(huì)有一個(gè)對(duì)象作為第一個(gè)參數(shù)。 上一篇:【譯】《精通使用AngularJS開發(fā)Web App》(二) 下一篇:【譯】《精通使用AngularJS開發(fā)Web App》(四) 書名:Mastering W...
摘要:原文鏈接原文作者你想知道的關(guān)于作用域的一切譯中有許多章節(jié)是關(guān)于的但是對(duì)于初學(xué)者來說甚至是一些有經(jīng)驗(yàn)的開發(fā)者這些有關(guān)作用域的章節(jié)既不直接也不容易理解這篇文章的目的就是為了幫助那些想更深一步學(xué)習(xí)了解作用域的開發(fā)者尤其是當(dāng)他們聽到一些關(guān)于作用域的 原文鏈接: Everything you wanted to know about JavaScript scope原文作者: Todd Mott...
摘要:最近在上看到一篇關(guān)于變量提升的文章,原文在此。對(duì)于剛?cè)腴T的開發(fā)者時(shí)常難以理解變量方法提升的獨(dú)特行為。接下來我們要談?wù)?,,聲明,那么先了解變量提升就顯得更為重要了。在進(jìn)入作用域和不能訪問的這段時(shí)間,我們稱為暫時(shí)性死區(qū)。 showImg(https://segmentfault.com/img/bV0Nsd?w=800&h=450); 最近在Medium上看到一篇關(guān)于變量提升的文章,原文在...
摘要:關(guān)鍵字會(huì)實(shí)例化一個(gè)新的對(duì)象實(shí)例,并在執(zhí)行構(gòu)造函數(shù)時(shí)將指向該實(shí)例。原文鏈接譯是什么對(duì)象的內(nèi)部工作原理 原文鏈接:What is this? The Inner Workings of JavaScript Objects (需要梯子) 原文作者:Eric Elliott 譯文永久鏈接:【譯】什么是 this?JavaScript 對(duì)象的內(nèi)部工作原理 譯者:士心 翻譯目的:函數(shù)動(dòng)...
閱讀 3521·2023-04-25 22:45
閱讀 1315·2021-11-11 16:54
閱讀 2821·2019-08-30 15:44
閱讀 3211·2019-08-30 15:44
閱讀 1674·2019-08-30 13:55
閱讀 974·2019-08-29 18:45
閱讀 1227·2019-08-29 17:25
閱讀 1039·2019-08-29 12:59