<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] >[success] # 詞法聲明(lexicalDecls)和變量聲明(varDelcs) * 來自極客時間周愛民老師《JavaScript核心原理解析》讀后一些整理總結 * [阮一峰老師的內存泄漏文章](http://www.ruanyifeng.com/blog/2017/04/memory-leak.html) ~~~ 1.變量聲明(varDelcs) -- 沒有綁定值的var所聲明的標識符的,在js環境中創建,變量名(varName in varDecls)后, 會為它初始化綁定一個 undefined 值 2.詞法聲明(lexicalDecls) -- let/const 詞法名字(lexicalNames)在創建之后它們在缺省情況下,就是'還沒有綁定值' 的標識符,只有在運行階段執行后才能使用。 3.'6 種聲明'語句中的函數是按 varDecls 的規則聲明的;類的內部是處于嚴格模中,它的名字是按 let 來處理的,而 import 導入的名字則是按 const 的規則來處理的。所以,所有的聲明本質上只有三種處理模式:var 變量聲明、let 變 量聲明和 const 常量聲明。 ~~~ >[info] ## 弄清一個概念 -- 非聲明變量(隱式全局變量) / var / let、const [MDN -- var ](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/var) ~~~ 1.用'var'聲明的變量的作用域是它當前的執行上下文,它可以是嵌套的函數,也可以是聲明在任何函數外的變量, 這句簡單的理解:'var'聲明的變量如果在函數中那么他的作用域就是在當前函數里,如果不在函數中它的作用域 就在全局里 2.'隱式全局變' -- 將賦值給未聲明變量的值在執行賦值時將其隱式地創建為全局變量 下面將借用MDN中代碼更好的說明這兩點 ~~~ * 聲明變量的作用域限制在其聲明位置的上下文中,而非聲明變量總是全局的。 ~~~ function x() { y = 1; // 在嚴格模式(strict mode)下會拋出 ReferenceError 異常 var z = 2; } x(); console.log(y); // 打印 "1" console.log(z); // 拋出 ReferenceError: z 未在 x 外部聲明 ~~~ * 聲明變量在任何代碼執行前創建,而非聲明變量只有在執行賦值操作的時候才會被創建。 ~~~ // 非聲明 變量隱式全局變量如果沒有上來賦值就報錯 console.log(a); // 拋出ReferenceError。 console.log('still going...'); // 永不執行。 // var 這中聲明變量就不會有這個問題 var a; console.log(a); // 打印"undefined"或""(不同瀏覽器實現不同)。 console.log('still going...'); // 打印"still going..."。 ~~~ >[danger] ##### 根據上面知識擴展 varName 和 varDecls ~~~ 1.首先如果不使用變量聲明的'隱式全局變量'會出現一個問題就是'變量泄漏',可以使用嚴格模式杜絕這種寫法, 或者使用變量聲明的寫法 2.在ES6 出現后 js 全局就被分成了兩種,因為我們向上面說的在特定情況下'var' 聲明的也是全局變量,既然 全局變量不好為啥es6出現后不直接干掉全局變量這種概念呢,因為js 要做到向下兼容,之前支持所以現在 依然要支持,不過但是為了得到一個'盡可能'與其它變量環境相似的聲明效果'(varDecls)',ECMAScript 規定 在這個全局對象之外再維護一個變量名列表'(varNames)' 3.下面代碼我是在瀏覽器運行的因此用'getOwnPropertyDescriptor'屬性比較的是'window' 存在情況,如果你在 'node' 你可以比較'global',通過下面代碼利用'getOwnPropertyDescriptor' 方法也能證明'var' 在非函數內聲明的 情況下也是個全局變量,但要注意了此時'var' 聲明的全局變量其實存在'varNames'一個變量列表里的,他和 隱式全局變量不一樣,算然他們都是全局變量 4.也可以理解 為什么'var' 聲明的變量不能被'delete' 刪除,你可以更抽象的理解在'varNames'列表內的變量聲明 是不讓刪除的,但也不是全都著這樣,如果'var'聲明發生在 eval() 中的時候,雖然現在'var' 聲明變量也在'varNames' 列表中但是可以刪除 可以看第二段代碼,僅僅是在這種情況下是特例 ~~~ ~~~ var a = 100 b = 100 console.log(Object.getOwnPropertyDescriptor(window, 'a')) // {value: 100, writable: true, enumerable: true, configurable: false} console.log(Object.getOwnPropertyDescriptor(window, 'b')) // {value: 100, writable: true, enumerable: true, configurable: true} // 不能刪除 console.log(delete a) // false // 可以刪除 console.log(delete b) // true ~~~ * 這里的代碼是在node環境下運行的 ~~~ # 使用eval聲明 > eval('var b = 300'); # 它的性質是可刪除的 > Object.getOwnPropertyDescriptor(global, 'b').configurable; true # 檢測與刪除 > b 300 > delete b true > b ReferenceError: b is not define ~~~ >[danger] ##### 總結 ~~~ 1.站在es6的角度來說,'隱式全局變量'--'varDecls' 存著,'var' -- 'varNames'存著,let/const -- lexicalDecls 2.如果我們寫了這樣一行代碼: let a = 100 console.log(Object.getOwnPropertyDescriptor(window, 'a')) // undefind 你會發現打印的是'undefind',雖然全局作用域里用let,const創建的變量,雖然也是全局可見,但它并沒有創建在 'global' 或者'window'上,那'let,const' 和'var'在'global'這兩個作用域是什么關系呢? 這里引用了'周愛民'老師的回答: 在JavaScript中,'全局環境'里面的'var與let/const'是'用了兩個東西來管理'的,所以他們也確實是創建在不同的地方。 但是從'作用域鏈'的角度上來說,它們并沒有級別高低(也就是parent沒有相互指向)。使得它們存取的效果有差別 的,是因為'全局環境'采用了詞法環境優先(也就是let/const聲明)的順序。 ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看