我認爲這部分的關鍵有如下幾點:java
var eatFood = {
food : 'apple',
eatIt(){
// ...
},
getFood(){
// ...
}
}
複製代碼
一般咱們建立一個對象,這個對象即是一個命名空間,咱們能夠在其中寫一些方法,以後點調用便可。```
var a = 2;
function foo(){
var a = 3;
console.log(a) //3
}
console.log(a) // 2
foo()
```
在上述代碼中,咱們利用函數做用域的特性,實現了「隱藏」了foo函數中的a屬性,可是,
咱們必須用函數將其包裹,給定一個函數名,以後在調用它。若是函數不須要函數名,
而且可以自動運行,那就太理想啦!而JS爲咱們提供瞭解決方案————當即執行函數。
複製代碼
函數表達式是啥玩意兒?bash
我的理解:若是聲明中function是第一個單詞,那就是函數聲明,不然就是函數表達式app
(function foo(){ //... }) 函數表達式
+function foo(){ //... } 函數表達式
function(){ //... } 函數聲明
複製代碼
具名和匿名模塊化
匿名函數表達式函數
(function(){ //... })ui
注意點:函數表達式能夠匿名,而函數聲明堅定不能夠!spa
匿名的優缺點:調試
優勢:code
缺點:模塊化開發
始終給函數表達式命名是一個最佳實踐
當即執行函數表達式(IIFE)
寫法: (function(){ //... }(param)) 或者 (function(){ //... })(param)
{
//...
}
{
//...
}
這倆玩意兒,就是倆單獨的塊做用域!
複製代碼
其實在ES6到來以前呢,JS已經有了使用塊做用域的情景。
with和try/catch
with在以前咱們討論過它,它能夠從對象中建立出一個新的做用域,而這個做用域僅僅在with聲明中有效。
try{ ... }catch(error){ a️ }
說出來你可能不相信,若是你能捕獲到error,那麼這個error只能在以後的{}中使用,在其餘地方,你根本獲取不到!
{
var a = 'a';
let b = 'b';
}
console.log(a) // 'a'
console.log(b) // b is not defined
var聲明的變量沒法識別塊級做用域,而let聲明的變量是ok的。
複製代碼
for(let i = 0;i<10;i++){
let i = 1 // 不會報錯
// 在for循環中,存在父子做用域
// for循環頭部的let不只將i綁定到for循環的塊中
// 事實上,它將其從新綁定到循環的每個迭代中
}
下面經過另外一種方式來講明每次迭代時進行從新綁定的行爲:
{
let j;
for(j=0;j<10;j++){
let i = j;
console.log(i)
}
}
複製代碼
除了let以外,ES6還引入了另外一種聲明變量的方式:const,一樣能夠用來建立塊做用域變量,但它的值是固定的,準確的來講,地址是固定的。