亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

【譯】理解JavaScript:作用域

betacat / 3008人閱讀

摘要:作用域是代碼的不同部分在運(yùn)行期間的可見(jiàn)性。大多數(shù)開(kāi)發(fā)者想當(dāng)然地理解作用域,但毫無(wú)疑問(wèn),有它自己的說(shuō)明。變量可能是全局作用域的,或者是方法作用域的。總而言之,不要重復(fù)聲明變量,使用良好命名,盡力避免在聲明前調(diào)用和執(zhí)行任何東西。

原文鏈接:https://hackernoon.com/unders...

什么是作用域?

就像JavaScript中的其他東西一樣,作用域并無(wú)特別之處。盡管大多數(shù)開(kāi)發(fā)者并不會(huì)在上面太多時(shí)間,不過(guò),深入理解作用域有助于你寫(xiě)更干凈的應(yīng)用,也有助于降低錯(cuò)誤和實(shí)現(xiàn)更好的設(shè)計(jì)模式。

作用域是代碼的不同部分在運(yùn)行期間的可見(jiàn)性。

大多數(shù)開(kāi)發(fā)者想當(dāng)然地理解作用域,但毫無(wú)疑問(wèn),JavaScript有它自己的說(shuō)明。變量可能是全局作用域的,或者是方法作用域的。這也就意味著,變量存在于任何地方都能被訪(fǎng)問(wèn)的全局,或者存在于聲明它們的方法之內(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ù)的例子,并展示了它如何訪(fǎng)問(wèn)父作用域的變量。正如父函數(shù) functionScope()那樣 ,它內(nèi)部聲明的每個(gè)變量只在其內(nèi)部和它的內(nèi)部函數(shù)中有效。

注意:絕對(duì)不要使用未聲明的變量 如果那樣做了,引擎會(huì)冒泡到父作用域?qū)ふ掖俗兞?。如果尋之不得,js會(huì)為你聲明一個(gè)。這樣你無(wú)意之中就創(chuàng)建了一個(gè)全局變量并擾亂了全局作用域。

另外,未定義和未聲明不是同一件事情。未定義:聲明了一個(gè)變量但沒(méi)有賦值,未聲明:變量根本還沒(méi)有被聲明。

好了,到目前為止,沒(méi)有什么特別之處,且看下面代碼如何返回:

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?!

因此,我們寫(xiě)的和實(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í)候千萬(wàn)小心,因?yàn)橹挥泻瘮?shù)的聲明提升了。我們現(xiàn)在對(duì)JavaScript中的的作用域和變量提升有了基本的理解,實(shí)際上兩者有很大不同。JS代碼的整個(gè)執(zhí)行過(guò)程非常不同,并且變量提升也并非大多說(shuō)人所想。這更多的是我們持有的精神概念。

編譯

出乎意料,JavaScript確實(shí)需要編譯。V8引擎在執(zhí)行前通過(guò)將JavaScript編譯成本地機(jī)器碼而不是執(zhí)行字節(jié)碼或解釋它來(lái)提升性能。實(shí)際上引擎會(huì)多線(xiàn)程運(yùn)行代碼。其中一個(gè)線(xiàn)程,負(fù)責(zé)聲明所有方法和變量,所以在運(yùn)行時(shí)都已存在。雖然解釋編譯過(guò)程更加簡(jiǎn)單,對(duì)于變量提升我們創(chuàng)建了在代碼運(yùn)行前如何組織代碼的思維導(dǎo)圖。

簡(jiǎn)言之---在JS代碼實(shí)際執(zhí)行前,引擎已經(jīng)運(yùn)行了整個(gè)腳本并在它們的作用域中聲明了所有的變量和方法。所以在運(yùn)行時(shí),它們已經(jīng)存在,變量提升并非什么黑魔法。如果你理解了這個(gè),你就超過(guò)了其他90%的JavaScript開(kāi)發(fā)者。

總結(jié)

JavaScript的作用域還有很多需要學(xué)習(xí)。為了縮短篇幅讓大家有個(gè)基本的理解,我甚至都沒(méi)有提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://www.ezyhdfw.cn/yun/94971.html

相關(guān)文章

  • 理解JavaScript:閉包

    摘要:當(dāng)面試中讓我解釋一下閉包時(shí)我懵逼了。這個(gè)解釋開(kāi)始可能有點(diǎn)晦澀,讓我們抽絲剝繭摘下閉包的真面目。此文不詳述作用域有專(zhuān)門(mén)的主題闡述,不過(guò)作用域是理解閉包原理的基礎(chǔ)。這才是閉包的真正便利之處。閉包使用不當(dāng)就會(huì)很坑。 原文鏈接 為什么深度學(xué)習(xí)JavaScript? JavaScript如今是最流行的編程語(yǔ)言之一。它運(yùn)行在瀏覽器、服務(wù)器、移動(dòng)設(shè)備、桌面應(yīng)用,也可能包括冰箱。無(wú)需我舉其他再多不相干...

    岳光 評(píng)論0 收藏0
  • 】《精通使用AngularJS開(kāi)發(fā)Web App》(三)--- 深入scope,繼承結(jié)構(gòu),事件系

    摘要:比如,我們可以監(jiān)聽(tīng)事件由實(shí)例發(fā)出,然后在任何瀏覽器中就是變化的時(shí)候都會(huì)得到通知,如下所示每一個(gè)作用域?qū)ο蠖紩?huì)有這個(gè)方法,可以用來(lái)注冊(cè)一個(gè)作用域事件的偵聽(tīng)器。這個(gè)函數(shù)所扮演的偵聽(tīng)器在被調(diào)用時(shí)會(huì)有一個(gè)對(duì)象作為第一個(gè)參數(shù)。 上一篇:【譯】《精通使用AngularJS開(kāi)發(fā)Web App》(二) 下一篇:【譯】《精通使用AngularJS開(kāi)發(fā)Web App》(四) 書(shū)名:Mastering W...

    wind5o 評(píng)論0 收藏0
  • [] 你想知道的關(guān)于 JavaScript 作用的一切

    摘要:原文鏈接原文作者你想知道的關(guān)于作用域的一切譯中有許多章節(jié)是關(guān)于的但是對(duì)于初學(xué)者來(lái)說(shuō)甚至是一些有經(jīng)驗(yàn)的開(kāi)發(fā)者這些有關(guān)作用域的章節(jié)既不直接也不容易理解這篇文章的目的就是為了幫助那些想更深一步學(xué)習(xí)了解作用域的開(kāi)發(fā)者尤其是當(dāng)他們聽(tīng)到一些關(guān)于作用域的 原文鏈接: Everything you wanted to know about JavaScript scope原文作者: Todd Mott...

    Flands 評(píng)論0 收藏0
  • :用let 和 const 來(lái)指導(dǎo)JavaScript 的變量提升

    摘要:最近在上看到一篇關(guān)于變量提升的文章,原文在此。對(duì)于剛?cè)腴T(mén)的開(kāi)發(fā)者時(shí)常難以理解變量方法提升的獨(dú)特行為。接下來(lái)我們要談?wù)?,,聲明,那么先了解變量提升就顯得更為重要了。在進(jìn)入作用域和不能訪(fǎng)問(wèn)的這段時(shí)間,我們稱(chēng)為暫時(shí)性死區(qū)。 showImg(https://segmentfault.com/img/bV0Nsd?w=800&h=450); 最近在Medium上看到一篇關(guān)于變量提升的文章,原文在...

    sanyang 評(píng)論0 收藏0
  • 】this 是什么?JavaScript 對(duì)象的內(nèi)部工作原理

    摘要:關(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)...

    Hwg 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<