摘要:變量作用域詳解作用域規(guī)則大部分情況下沒(méi)有塊級(jí)作用域除非你使用當(dāng)你使用的情況下僅僅支持函數(shù)作用域不使用聲明的變量為全局變量不用情況下中局部變量只能通過(guò)和函數(shù)參數(shù)聲明大部分情況下沒(méi)有塊級(jí)作用域除非你使用與很多語(yǔ)言不同在之前并沒(méi)有塊級(jí)作用域一個(gè)作
Javascript變量作用域詳解 JS作用域規(guī)則
JS大部分情況下沒(méi)有塊級(jí)作用域, 除非你使用let
當(dāng)你使用var的情況下, JS僅僅支持函數(shù)作用域
不使用var, let聲明的變量為全局變量
不用let情況下, JS中局部變量只能通過(guò)var和函數(shù)參數(shù)聲明
1. JS大部分情況下沒(méi)有塊級(jí)作用域, 除非你使用let與很多語(yǔ)言不同, JS在ES6之前并沒(méi)有塊級(jí)作用域:
function test() { // 一個(gè)作用域 for(var i = 0; i < 10; i++) { // 不是一個(gè)作用域 // count } console.log(i); // 10 for(let j = 0; j < 10; j++) { // 是一個(gè)獨(dú)立作用域 // count } console.log(j); // j is not defined }
本例中i并不只存在于for循環(huán)的區(qū)域中而是存在于整個(gè)test函數(shù)中. 如果我們用let聲明變量i, i則擁有了塊級(jí)作用域
2. 在你使用var的情況下, JS僅僅支持函數(shù)作用域剛才講了在ES6之前JS沒(méi)有塊級(jí)作用域, 那有什么作用域呢? 答案是函數(shù)作用域.
function test() { var a = "hello" } test() console.log(a) // a is not defined
本例中在函數(shù)內(nèi)部聲明的變量a的作用域僅限于函數(shù)內(nèi)部, 所以在函數(shù)外部我們不能訪問(wèn)到.
3. 不使用var, let聲明的變量為全局變量如果我們把上面的例子中的var去掉會(huì)發(fā)生什么呢?
function test() { a = "hello" } test() console.log(a) // hello4. 不用let情況下, JS中局部變量只能通過(guò)var和函數(shù)參數(shù)聲明
由上面的分析我們知道, 函數(shù)內(nèi)部聲明的變量的作用域?yàn)楹瘮?shù)內(nèi)也就是屬于局部變量.
//Exp1: 典型錯(cuò)例 for (var i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); }, 1000); } // 10 10 10... //Exp2: 利用setTimeout函數(shù)傳入?yún)?shù) for (var i = 0; i < 10; i++){ setTimeout(function(i){ console.log(i); }, 1000, i); } // 1 2 3 4 ... //Exp3: 利用bind傳入函數(shù)參數(shù) for (var i = 0; i < 10; i++){ setTimeout(function(i){ console.log(i); }.bind(null, i), 1000); } // 1 2 3 4 ... //Exp4: 利用閉包的性質(zhì)傳入?yún)?shù) var cb = function(i) { return function() { console.log(i) } } for (var i = 0; i < 10; i++){ setTimeout(cb(i), 1000); } // 1 2 3 4 ...
后三個(gè)例子看似無(wú)關(guān)聯(lián)其實(shí)原理是一致的: 把變量當(dāng)作函數(shù)參數(shù)傳入函數(shù), 這樣變量就在函數(shù)中有了局部作用域而非全局作用域.
當(dāng)然, 這其實(shí)是JS設(shè)計(jì)上的缺陷, 在ES6時(shí)代我們只需要通過(guò)let創(chuàng)建擁有快級(jí)作用域的變量就可以輕松解決上述問(wèn)題了.
//Exp5: 利用let創(chuàng)建塊級(jí)作用域參數(shù) for (let i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); }, 1000); } // 1 2 3...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88059.html
摘要:而閉包的神奇之處正是可以阻止這件事情的發(fā)生。事實(shí)上內(nèi)部作用域依然存在,因此沒(méi)有被回收頻繁使用閉包可能導(dǎo)致內(nèi)存泄漏。拜所聲明的位置所賜,它擁有涵蓋內(nèi)部作用域的閉包,使得該作用域能夠一直存活,以供在之后任何時(shí)間進(jìn)行引用。 作用域 作用域(scope),程序設(shè)計(jì)概念,通常來(lái)說(shuō),一段程序代碼中所用到的變量并不總是有效/可用的,而限定這個(gè)變量的可用性的代碼范圍就是這個(gè)變量的作用域。通俗一點(diǎn)就是我...
摘要:不同的是函數(shù)體并不會(huì)再被提升至函數(shù)作用域頭部,而僅會(huì)被提升到塊級(jí)作用域頭部避免全局變量在計(jì)算機(jī)編程中,全局變量指的是在所有作用域中都能訪問(wèn)的變量。 ES6 變量作用域與提升:變量的生命周期詳解從屬于筆者的現(xiàn)代 JavaScript 開(kāi)發(fā):語(yǔ)法基礎(chǔ)與實(shí)踐技巧系列文章。本文詳細(xì)討論了 JavaScript 中作用域、執(zhí)行上下文、不同作用域下變量提升與函數(shù)提升的表現(xiàn)、頂層對(duì)象以及如何避免創(chuàng)建...
摘要:不是引用類(lèi)型,無(wú)法輸出簡(jiǎn)而言之,堆內(nèi)存存放引用值,棧內(nèi)存存放固定類(lèi)型值。變量的查詢?cè)谧兞康牟樵冎?,訪問(wèn)局部變量要比全局變量來(lái)得快,因此不需要向上搜索作用域鏈。 贊助我以寫(xiě)出更好的文章,give me a cup of coffee? 2017最新最全前端面試題 基本類(lèi)型值有:undefined,NUll,Boolean,Number和String,這些類(lèi)型分別在內(nèi)存中占有固定的大小空...
摘要:再看一段代碼這樣就清晰地展示了閉包的詞法作用域能訪問(wèn)的作用域?qū)?dāng)做一個(gè)值返回執(zhí)行后,將的引用賦值給執(zhí)行,輸出了變量我們知道通過(guò)引用的關(guān)系,就是函數(shù)本身。 在正式學(xué)習(xí)閉包之前,請(qǐng)各位同學(xué)一定要確保自己對(duì)詞法作用域已經(jīng)非常的熟悉了,如果對(duì)詞法作用域還不夠熟悉的話,可以先看: 深入理解閉包之前置知識(shí)---作用域與詞法作用域 前言 現(xiàn)在去面試前端開(kāi)發(fā)的崗位,如果你的面試官也是個(gè)前端,并且不是太...
摘要:環(huán)境由閉包創(chuàng)建時(shí)在作用域中的任何局部變量組成。嚴(yán)格來(lái)說(shuō),閉包需要滿足三個(gè)條件訪問(wèn)所在作用域函數(shù)嵌套在所在作用域外被調(diào)用閉包的形成原理先了解的垃圾回收機(jī)制會(huì)找出不再使用的變量,不再使用意味著這個(gè)變量生命周期的結(jié)束。 什么是閉包 最原始定義 閉包(closure),是指函數(shù)變量可以保存在函數(shù)作用域內(nèi),因此看起來(lái)是函數(shù)將變量包裹了起來(lái)。 //根據(jù)定義,包含變量的函數(shù)就是閉包 function...
閱讀 2934·2021-11-24 09:39
閱讀 3619·2021-11-22 13:54
閱讀 3419·2021-11-16 11:45
閱讀 2449·2021-09-09 09:33
閱讀 3203·2019-08-30 15:55
閱讀 1298·2019-08-29 15:40
閱讀 928·2019-08-29 15:19
閱讀 3406·2019-08-29 15:14