javascript幾個知識點

變量賦值

變量賦值分爲兩個動做:app

  1. 若是當前沒有聲明過,那編譯器會在當前做用域聲明一個。函數

  2. 運行時引擎會在做用域查找該變量,若是找到就對其賦值。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

IIFE: Immediately Invoked Function Expression(當即執行函數表達式)。編譯器

變量提高

全部的聲明(變量和函數)都會被「移動」到各自做用域的最頂端,這個過程稱爲「提高」。it

函數聲明會被提早到普通變量以前,若是存在同名的函數,後面的函數聲明會覆蓋前面的。

全部的變量都是先有聲明,再有賦值。栗子:

var a = 2;
// 第一步爲編譯階段任務
var a;
// 第二步執行階段任務
a = 2;

如何判斷this

  1. 函數是否在new中調用?若是是,this綁定的是新建立的對象。

  2. 函數是否經過call、apply或者硬綁定?若是是,this綁定的是指定的對象。

  3. 函數是否在某個上下文中調用?若是是,this綁定上下文對象。

  4. 若是都不是,使用默認綁定。嚴格模式綁定到undefined,不然爲全局對象。

  5. foo.call(null) 使用默認綁定規則。

  6. 箭頭函數的綁定是沒法被修改的(不適用於前4條規則),繼承外層函數調用的this綁定。

屬性描述符

  1. writeable:屬性的值是否能夠修改。

  2. configable:屬性的值可配置。若是是能夠配置的,那麼就能夠使用defineProperty()方法來修改屬性描述符。這種設置爲單向,不可取消。意思是能夠從true到false,可是不能從falsetrue。若是值爲false則禁止刪除這個屬性。

  3. enumerable:是否爲可枚舉的。若是是false那麼在使用for...in的時候不會出現。

PS:今天看到本子上隨意寫的,記錄下來,方便查看。

相關文章
相關標籤/搜索