《讀王福朋有感》

一、一切都是對象
  • 值類型和引用類型:值類型的類型判斷用typeof,引用類型的類型判斷用instanceof
  • 一切(引用類型)都是對象,對象是若干屬性的集合;方法也是一種屬性,由於其屬性表示爲鍵值對的形式;
二、函數和對象的關係
  • 對象都是經過函數建立的,而函數卻又是一種對象;
三、原型
  • 每一個函數function都有一個prototype,即原型;每一個對象都有一個__proto__,稱爲隱式原型;
  • 每一個對象都有一個__proto__屬性,指向建立該對象的函數的prototype,即Object.__proto__ === Function.prototype
  • Object.prototype是一個特例,它的__proto__指向的是null;
四、繼承
  • 訪問一個對象的屬性時,先在基本屬性中查找,若是沒有,再沿着__proto__這條鏈向上找,這就是原型鏈;
五、執行上下文

準備工做:javascript

全局代碼:java

  • 變量、函數表達式--變量聲明,默認賦值爲undefined;
  • this--賦值;
  • 函數聲明--賦值;

函數體:閉包

  • 參數--賦值;
  • arguments--賦值;
  • 自由變量的取值做用域--賦值;

這三種數據的準備狀況咱們稱之爲「執行上下文」或者「執行上下文環境」。
其實,JavaScript在執行一個代碼段以前,都會進行這些「準備工做」來生成執行上下文,這個「代碼段」分三種狀況--全局代碼、函數體、eval代碼。app

  • 函數每被調用一次,都會產生一個新的執行上下文環境;
  • 函數在定義的時候(不是調用的時候),就已經肯定了函數體內部自由變量的做用域;
var a = 10;
function fn () {
    console.log(a); 
}
function bar (f) { 
    var a = 20;
    f();
}
bar(fn);

給執行環境下一個通俗的定義--在執行代碼以前,把將要用到的全部的變量都事先拿出來,有的直接賦值了,有的先用undefined佔個空兒。函數


六、this

在函數中this取何值,是在函數真正被調用執行的時候肯定的,函數定義的時候肯定不了。由於this的取值是執行上下文環境的一部分,每次調用函數,都會產生一個新的執行上下文環境。this

case1:構造函數prototype

  • 所謂構造函數就是用來new對象的函數。若是函數做爲構造函數用,那麼其中的this就表明它即將new出來的對象;
  • 在構造函數的prototype中,即使是在整個原型鏈中,this表明的也都是當前對象的值;

case2:函數做爲對象的一個屬性code

  • 若是函數做爲對象的一個屬性時,而且做爲對象的一個屬性被調用時,函數中的this指向該對象;
  • 若是函數不做爲對象的一個屬性被調用,那麼this的值就是window;

case3:函數用call或apply調用對象

  • 當一個函數被call或apply調用時,this的值取傳入的對象的值;

case4:全局&&調用普通函數繼承

  • 在全局環境下,this永遠是window;
  • 普通函數在調用時,其中的this也都是window;
閉包 - - 一節未看
相關文章
相關標籤/搜索