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