- 值類型和引用類型:值類型的類型判斷用
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
case1:構造函數prototype
- 所謂構造函數就是用來new對象的函數。若是函數做爲構造函數用,那麼其中的this就表明它即將new出來的對象;
- 在構造函數的prototype中,即使是在整個原型鏈中,this表明的也都是當前對象的值;
case2:函數做爲對象的一個屬性code
- 若是函數做爲對象的一個屬性時,而且做爲對象的一個屬性被調用時,函數中的this指向該對象;
- 若是函數不做爲對象的一個屬性被調用,那麼this的值就是window;
case3:函數用call或apply調用對象
- 當一個函數被call或apply調用時,this的值取傳入的對象的值;
case4:全局&&調用普通函數繼承
- 在全局環境下,this永遠是window;
- 普通函數在調用時,其中的this也都是window;