變量賦值分爲兩個動做:app
若是當前沒有聲明過,那編譯器會在當前做用域聲明一個。函數
運行時引擎會在做用域查找該變量,若是找到就對其賦值。this
查詢有:LHS查詢和RHS查詢。LHS
:賦值操做的目標是誰。RHS
:誰是賦值操做的源頭,restrieve his source value(取到它的源值)。
舉個栗子:rest
// RHS引用,取到a的值。 console.log(a); // LHS引用,只須要對=2這個賦值操做找到一個目標 a = 2;
查看下面這個函數分別有幾回LHS和RHS?code
function foo(a) { var b = a; return a + b; } var c = foo(2);
其中有3次LHS:對象
c = foo(2) a = 2 b =a
4次RHS:繼承
foo a //由於要把a的值賦給b a+b中的a和別分別一次
使用關鍵字function
來判斷是否爲第一詞來區分,若是是爲函數聲明,若是不是那麼就是函數表達式。作用域
// 函數表達式 (function xxx(){})(); // 函數聲明 function xxx()
IIFE: Immediately Invoked Function Expression(當即執行函數表達式)。編譯器
全部的聲明(變量和函數)都會被「移動」到各自做用域的最頂端,這個過程稱爲「提高」。it
函數聲明會被提早到普通變量以前,若是存在同名的函數,後面的函數聲明會覆蓋前面的。
全部的變量都是先有聲明,再有賦值。栗子:
var a = 2; // 第一步爲編譯階段任務 var a; // 第二步執行階段任務 a = 2;
函數是否在new中調用?若是是,this
綁定的是新建立的對象。
函數是否經過call、apply或者硬綁定?若是是,this
綁定的是指定的對象。
函數是否在某個上下文中調用?若是是,this
綁定上下文對象。
若是都不是,使用默認綁定。嚴格模式綁定到undefined
,不然爲全局對象。
foo.call(null) 使用默認綁定規則。
箭頭函數的綁定是沒法被修改的(不適用於前4條規則),繼承外層函數調用的this
綁定。
writeable:屬性的值是否能夠修改。
configable:屬性的值可配置。若是是能夠配置的,那麼就能夠使用defineProperty()
方法來修改屬性描述符。這種設置爲單向,不可取消。意思是能夠從true
到false,可是不能從false
到true
。若是值爲false
則禁止刪除這個屬性。
enumerable:是否爲可枚舉的。若是是false
那麼在使用for...in
的時候不會出現。
PS:今天看到本子上隨意寫的,記錄下來,方便查看。