js聲明變量

計算機安全中,有個常規的原則:用戶只能訪問他們當前須要的東西。javascript

程序設計中,一般會有一個原則:當即返回原則,也稱短路計算。html

ES6 聲明變量的六種方法java

ES5 只有兩種聲明變量的方法:var命令和function命令。ES6除了添加letconst命令。還有另外兩種聲明變量的方法:import命令和class命令。因此,ES6 一共有6種聲明變量的方法。git

理解聲明變量,得先了解下做用域。JavaScript只有函數做用域和全局做用域,ES6引入塊級做用域es6

做用域內變量提高(var),與變量的聲明位置無關。可是變量應該是在聲明的時候才使用呀,ES6 let糾正了這種奇怪的狀況。web

變量綁定,函數做用域內申明瞭跟全局同名變量,只要函數做用域聲明該變量,它所聲明的變量就"綁定"在該區域了,再也不受外部影響。編程

變量篡改,全局做用域容易被篡改數組

暫時性死區,若是區塊中存在let和const命令,這個區塊對這些命令聲明的變量,從一開始就造成了封閉做用域。凡是在聲明以前就使用這些變量,就會報錯。安全

 

  • 全局做用域中申明變量能夠省略var,函數體內申明變量不帶var則認爲是全局變量
  • 函數做用域內var與全局相同的變量,該函數體內scope直接訪問局部變量,而沒法指向全局變量。
  • let不作變量提高,須要先聲明再調用,不然會報錯。
  • let聲明的變量,做用域最小到變量聲明的塊級,永遠最小(例如循環語句)。
  • let在同一個塊級做用域內不能夠重複聲明
  • 函數裏面的this,若是函數不是做爲對象的方法運行,而是單純做爲函數運行,this會指向頂層對象。可是,嚴格模式下,這時this會返回undefined
  • 函數體內的變量,能夠經過閉包語法訪問。
  • const聲明一個只讀常量,聲明變量和初始化值必須在一塊兒,不可修改。
  • const只是代表指向的地址不可變,當const一個對象時,對象參數是能夠修改的,包括數組。Object.freeze凍結對象。
  • var聲明的變量,執行方法的時候無論聲明方法的位置,變量的值調用時才確認。
  • 塊級做用域是一個語句,多個操做封裝在一塊兒,並無返回值。使用do語句能夠得到返回值(本身動手並未實現該效果)。
  • let經常使用到塊級做用域,好比for、if(var會將塊級做用域的變量提高到函數或者全局做用域,var會污染全局變量),let相較var更嚴謹一點。
  • 全局做用域容易被篡改,即變量覆蓋。因此在聲明變量的時候都要使用關鍵字進行聲明。
  • let在全局做用域聲明變量,沒法經過頂層對象window.x訪問。
  • this綁定的值定義的執行上下文。

詞法做用域,函數的執行語句在函數內運行,而不是在執行它的做用域內運行。即每一個做用域內的變量是相互獨立的,全局做用域除外(變量提高的坑)。閉包

變量值的綁定,向外部逐漸擴展,返回查詢到的第一個值,結束搜索。

閉包,定義在函數內部的函數,做爲子函數用來讓外部讀取函數內部的局域變量,鏈接函數內外部。

 

參考資料:

1.ES6標準入門(阮一峯)http://es6.ruanyifeng.com/#docs/let

2.默語博客http://www.cnblogs.com/syfwhu/p/4839562.html

3.理解 Javascript 中變量的做用域(伯樂在線):http://web.jobbole.com/82599/?utm_source=blog.jobbole.com&utm_medium=relatedPosts

4.學習Javascript閉包(阮一峯):http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

5.函數式編程入門教程(阮一峯):http://www.ruanyifeng.com/blog/2017/02/fp-tutorial.html

6.JS函數式編程指南(gitbook):https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/

相關文章
相關標籤/搜索