摘要:變量作用域詳解作用域規(guī)則大部分情況下沒有塊級作用域除非你使用當(dāng)你使用的情況下僅僅支持函數(shù)作用域不使用聲明的變量為全局變量不用情況下中局部變量只能通過和函數(shù)參數(shù)聲明大部分情況下沒有塊級作用域除非你使用與很多語言不同在之前并沒有塊級作用域一個作
Javascript變量作用域詳解 JS作用域規(guī)則
JS大部分情況下沒有塊級作用域, 除非你使用let
當(dāng)你使用var的情況下, JS僅僅支持函數(shù)作用域
不使用var, let聲明的變量為全局變量
不用let情況下, JS中局部變量只能通過var和函數(shù)參數(shù)聲明
1. JS大部分情況下沒有塊級作用域, 除非你使用let與很多語言不同, JS在ES6之前并沒有塊級作用域:
function test() { // 一個作用域 for(var i = 0; i < 10; i++) { // 不是一個作用域 // count } console.log(i); // 10 for(let j = 0; j < 10; j++) { // 是一個獨立作用域 // count } console.log(j); // j is not defined }
本例中i并不只存在于for循環(huán)的區(qū)域中而是存在于整個test函數(shù)中. 如果我們用let聲明變量i, i則擁有了塊級作用域
2. 在你使用var的情況下, JS僅僅支持函數(shù)作用域剛才講了在ES6之前JS沒有塊級作用域, 那有什么作用域呢? 答案是函數(shù)作用域.
function test() { var a = "hello" } test() console.log(a) // a is not defined
本例中在函數(shù)內(nèi)部聲明的變量a的作用域僅限于函數(shù)內(nèi)部, 所以在函數(shù)外部我們不能訪問到.
3. 不使用var, let聲明的變量為全局變量如果我們把上面的例子中的var去掉會發(fā)生什么呢?
function test() { a = "hello" } test() console.log(a) // hello4. 不用let情況下, JS中局部變量只能通過var和函數(shù)參數(shù)聲明
由上面的分析我們知道, 函數(shù)內(nèi)部聲明的變量的作用域為函數(shù)內(nèi)也就是屬于局部變量.
//Exp1: 典型錯例 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 ...
后三個例子看似無關(guān)聯(lián)其實原理是一致的: 把變量當(dāng)作函數(shù)參數(shù)傳入函數(shù), 這樣變量就在函數(shù)中有了局部作用域而非全局作用域.
當(dāng)然, 這其實是JS設(shè)計上的缺陷, 在ES6時代我們只需要通過let創(chuàng)建擁有快級作用域的變量就可以輕松解決上述問題了.
//Exp5: 利用let創(chuàng)建塊級作用域參數(shù) for (let i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); }, 1000); } // 1 2 3...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/88059.html
摘要:而閉包的神奇之處正是可以阻止這件事情的發(fā)生。事實上內(nèi)部作用域依然存在,因此沒有被回收頻繁使用閉包可能導(dǎo)致內(nèi)存泄漏。拜所聲明的位置所賜,它擁有涵蓋內(nèi)部作用域的閉包,使得該作用域能夠一直存活,以供在之后任何時間進行引用。 作用域 作用域(scope),程序設(shè)計概念,通常來說,一段程序代碼中所用到的變量并不總是有效/可用的,而限定這個變量的可用性的代碼范圍就是這個變量的作用域。通俗一點就是我...
摘要:不同的是函數(shù)體并不會再被提升至函數(shù)作用域頭部,而僅會被提升到塊級作用域頭部避免全局變量在計算機編程中,全局變量指的是在所有作用域中都能訪問的變量。 ES6 變量作用域與提升:變量的生命周期詳解從屬于筆者的現(xiàn)代 JavaScript 開發(fā):語法基礎(chǔ)與實踐技巧系列文章。本文詳細討論了 JavaScript 中作用域、執(zhí)行上下文、不同作用域下變量提升與函數(shù)提升的表現(xiàn)、頂層對象以及如何避免創(chuàng)建...
摘要:不是引用類型,無法輸出簡而言之,堆內(nèi)存存放引用值,棧內(nèi)存存放固定類型值。變量的查詢在變量的查詢中,訪問局部變量要比全局變量來得快,因此不需要向上搜索作用域鏈。 贊助我以寫出更好的文章,give me a cup of coffee? 2017最新最全前端面試題 基本類型值有:undefined,NUll,Boolean,Number和String,這些類型分別在內(nèi)存中占有固定的大小空...
閱讀 2922·2021-11-24 09:39
閱讀 3599·2021-11-22 13:54
閱讀 3409·2021-11-16 11:45
閱讀 2433·2021-09-09 09:33
閱讀 3194·2019-08-30 15:55
閱讀 1290·2019-08-29 15:40
閱讀 920·2019-08-29 15:19
閱讀 3396·2019-08-29 15:14