摘要:變量聲明提前看代碼以上代碼報(bào)錯(cuò),這很好理解根本就沒聲明當(dāng)然報(bào)錯(cuò)啦,往下看以上代碼對(duì)于解釋器來(lái)說(shuō)是下面這樣的,所以沒有報(bào)錯(cuò),且輸出了再來(lái)看一中情況原因如下對(duì)于解釋器來(lái)代碼是這樣的向上首先找到局部變量函數(shù)提前以上代碼中函數(shù)不只是聲明提前了而是整
1、變量聲明提前:
看代碼
(function(){ function add(){ alert(a); } })() /* 以上代碼報(bào)錯(cuò):ReferenceError: a is not defined, * 這很好理解 根本就沒聲明當(dāng)然報(bào)錯(cuò)啦,往下看: */ (function(){ function add(){ alert(a); // output:undefined; var a = "bcd"; alert(a); // output:bcd; } })() //以上代碼對(duì)于解釋器來(lái)說(shuō)是下面這樣的,所以沒有報(bào)錯(cuò),且輸出了undefined; (function(){ function add(){ var a; // eq: var a = undefined; alert(a); // output:undefined; a = "bcd"; alert(a); // output:bcd; } })() //再來(lái)看一中情況: (function(){ var a = "wer"; function add(){ alert(a); // output:undefined; var a = "bcd"; alert(a); // output:bcd; } })() /* *原因如下:對(duì)于解釋器來(lái)代碼是這樣的 */ (function(){ var a = "wer"; function add(){ var a; // eq:var a = undefined; alert(a); // 向上首先找到局部變量a, a = "bcd"; alert(a); } })()
2、函數(shù)提前:
(function(){ alert(add(1, 3)); // output:4, function add(x, y){ return x + y; } }) // 以上代碼中函數(shù)add 不只是聲明提前了而是整個(gè)add函數(shù)的定義都被提前了 //另一種情況: (function(){ alert(add(1, 3)); //TypeError: add is not a function var add = function(x, y){ return x + y; } })() //對(duì)于編譯器來(lái)說(shuō)代碼如下: (function(){ var add; alert(add(1, 3)); //所以TypeError add = function(x, y){ return x + y; } })()
**總結(jié):** 1、變量的聲明被提前到作用域頂部,賦值保留在原地 2、函數(shù)聲明整個(gè)“被提前” 3、函數(shù)作為值賦給變量時(shí)只有變量“被提前”了,函數(shù)沒有“被提前”
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79817.html
摘要:但是變量只有其聲明被提前在作用域的最開始處,賦值結(jié)果仍然還在原來(lái)位置。 這篇博文是之前在CSDN寫的,現(xiàn)在移至sf。 有過(guò)C或者Java類編程經(jīng)驗(yàn)的同學(xué),對(duì)于先聲明后使用的規(guī)則很熟悉,如果使用未聲明的變量或者函數(shù),編譯時(shí)程序會(huì)報(bào)錯(cuò)!但是,JavaScript卻是一個(gè)‘大奇葩’,可以在變量或者函數(shù)聲明之前使用,現(xiàn)在根據(jù)我的理解在做一下說(shuō)明。 首先說(shuō)明JS的hoist分為變量hoist和函...
摘要:而外層的函數(shù)不能訪問(wèn)內(nèi)層的變量或函數(shù),這樣的層層嵌套就形成了作用域鏈。閉包閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù),創(chuàng)建閉包的最常見的方式就是在一個(gè)函數(shù)內(nèi)創(chuàng)建另一個(gè)函數(shù),通過(guò)另一個(gè)函數(shù)訪問(wèn)這個(gè)函數(shù)的局部變量。 閉包是js中一個(gè)極為NB的武器,但也不折不扣的成了初學(xué)者的難點(diǎn)。因?yàn)閷W(xué)好閉包就要學(xué)好作用域,正確理解作用域鏈,然而想做到這一點(diǎn)就要深入的理解函數(shù),所以我們從函數(shù)說(shuō)起。 函數(shù)...
摘要:四這個(gè)題目比較簡(jiǎn)單即函數(shù)聲明和變量聲明的關(guān)系和影響,遇到同名的函數(shù)聲明,不會(huì)重新定義五關(guān)于這個(gè)題目,的規(guī)范有解釋的。屬性的值是對(duì)象關(guān)于對(duì)象的具體定義,看這里對(duì)象六這個(gè)題目可以說(shuō)是最簡(jiǎn)單的,也是最詭異的關(guān)于這個(gè)題目,我們先來(lái)了解個(gè)概念。 廢話不多說(shuō),直接看題目,先不要急著看答案 先自己思考,收獲更多 (長(zhǎng)期補(bǔ)倉(cāng)); 一 var out = 25, inner = { ...
摘要:作用域執(zhí)行上下文變量提前函數(shù)聲明提前確定值范圍一段或者一個(gè)函數(shù)都會(huì)生成一個(gè)執(zhí)行上下文全局一段變量定義函數(shù)聲明函數(shù)變量定義函數(shù)聲明參數(shù)集合變量提前代碼解析執(zhí)行過(guò)程變量定義提前賦值函數(shù)聲明提前代碼解析函數(shù)聲明函數(shù)表達(dá)式執(zhí)行過(guò)程執(zhí)行過(guò)程執(zhí)行時(shí)才能 1.作用域 執(zhí)行上下文 (變量提前、函數(shù)聲明提前、確定this值、arguments) 范圍:一段或者一個(gè)函數(shù)(都會(huì)生成一個(gè)執(zhí)行上下文) ...
摘要:構(gòu)造函數(shù)調(diào)用會(huì)使用新創(chuàng)建的對(duì)象作為調(diào)用上下文。函數(shù)的參數(shù)相關(guān)可選形參當(dāng)傳入的實(shí)參比函數(shù)聲明時(shí)指定的形參數(shù)量要少,剩下的形參都將設(shè)置為值實(shí)參多則會(huì)自動(dòng)省略。它們的第一個(gè)實(shí)參是要調(diào)用函數(shù)的母對(duì)象,它是調(diào)用上下文,函數(shù)體內(nèi)通過(guò)引用它。 寫在前面 注:這個(gè)系列是本人對(duì)js知識(shí)的一些梳理,其中不少內(nèi)容來(lái)自書籍:Javascript高級(jí)程序設(shè)計(jì)第三版和JavaScript權(quán)威指南第六版,感謝它們的...
閱讀 1087·2021-09-29 09:35
閱讀 4673·2021-09-22 15:24
閱讀 1463·2021-07-25 21:37
閱讀 2194·2019-08-30 14:17
閱讀 982·2019-08-30 13:56
閱讀 2424·2019-08-29 17:07
閱讀 1284·2019-08-29 12:44
閱讀 2714·2019-08-26 18:26