1、( . )點操做符 與( [ ] ) 方括號操做符函數
(一)( . )點操做符spa
var earth = person.name; //獲得person對象的name屬性
點操做符的右側是一個以屬性名稱命名的標識符,標識符是靜態的。code
(二) [ ] 方括號操做符對象
var earth = person['age']; //獲得person對象的age屬性
方括號操做符的內部是一個返回結果爲字符串的表達式,該字符串就是屬性的名字。嚴格來講表達式必須返回字符串或一個能夠轉換爲字符串的值。blog
因爲字符串值是動態的,因此能夠再運行時更改。作用域
2、變量、函數做用域及做用域鏈字符串
(一)變量做用域io
變量的做用域取決於定義變量的位置,就像在全局中定義的變量,那他的做用域就是全局做用域。若是一個變量在函數內定義,那麼這個變量就是局部做用域,做用於這個函數體內,值得一提的是函數的參數也屬於局部變量。console
(二)函數做用域function
函數的做用域指在該函數體內聲明的變量,在該函數體內是始終能夠看見的。
介於定義的函數方式有兩種,一種是函數聲明,一種是函數表達式。這裏對函數聲明的定義方式進行說明。
函數聲明有一個很重要的特徵,那就是函數聲明提高、函數內的變量聲明提早。
var scope = 'global';
origin();
function origin(){ console.log(scope); var scope = 'local'; console.log(scope); }
函數聲明提高指的是在執行代碼前,會先讀取函數聲明,因此把調用它的語句放在函數前面也依然能夠獲得執行。
函數聲明提早指的是在函數內,會將全部的變量聲明提早到函數內的最上部,但只是此時的變量只是聲明瞭,並未賦值。
執行函數時,在origin函數內的第一個console.log會打印undefined,這是由於scope變量的聲明提到了console.log前,但未賦值,因此顯示undefined。只有真正執行到了變量所在行時,纔會爲其賦值,因此第二個console.log會打印出‘local’(聲明瞭一個全局變量scope,在函數內部也聲明瞭一個局部變量scope。在函數執行時,遇到兩個同名的變量,局部變量就會覆蓋全局變量)。
(三)做用域鏈
函數的做用域鏈有兩種狀態,一種是函數定義時,一種是調用函數時。
表示變量的對象被稱爲變量對象。
函數定義時,會建立一個包含全局變量對象(全局對象)的做用域鏈,這個做用域鏈被保存在函數的內部屬性[[scope]]中。
當函數被調用時,就會建立一個執行環境,將該函數內的arguments屬性和參數放入活動對象內(局部對象),此時這個活動對象位於做用域鏈的第一個,再將包含該函數的外部函數的全局變量對象放在做用域鏈的第二個。因此這就是爲何在函數內部就能夠訪問到函數外部變量的緣由,以下圖。