作用域鏈:
1.JS中只有函數能夠限定作用域的範圍;
2.變量處理在制定的函數範圍內,還有一個特殊的作用域,就是沒有用var 聲明的全局作用域
3.js中的作用域鏈是爲了清晰的表示出所有變量的作用範圍,同一作用範圍的變量處在同一作用域鏈上
4.在script中表示的第一個作用域鏈:0鏈,如果有函數,表示在這個位置第二個鏈,記爲1鏈,依次得到2鏈,3鏈
5.變量的訪問規則:現在當前作用域找,找不到就往上找,直到找到0鏈,還沒有就拋異常
注意:
函數也是變量
沙箱模式:爲了安全,不污染別的變量
(function(){})();
閉包:
閉包就是函數裏面的變量而已,只不過它在函數裏面,這個整體就叫做閉包,別人訪問不到它,它就形成一個壁壘一樣,被包裹的東西
它就像牆一樣包裹起來,你看到不到它。
對應了JavaScript的面向對象的特性,使之具有私有變量
使用時:爲了防止性能損失,可以使用閉包先存一部分數據
Var foo1= function(){ };
Var foo2=(function(){})();
函數的四種調用形式
- 函數調用 this(全局變量)
- 方法調用 this (當前對象)
- 構造器調用 this(表示創建當前對象)
- apply與call調用 上下文調用,this根據參數自定義
面向對象與原型
JavaScript對象:鍵值對
JavaScript方法:值爲函數的屬性
JavaScript原型:對象繼承實體
C系繼承模型
例如:C++,C#,Java
繼承:模板類
原型繼承
例如:JavaScript
繼承:(實體),有一個對象存在,構造函數設置原型爲這個對象;創建出來的對象就繼承了這個對象(從對象那裏繼承)
原型:就是函數的prototype屬性
原型鏈
每個對象有一個屬性 叫_proto_,這個屬性就是對象的原型
所以,需要原型,那就一定要有函數
高級
對象有原型,而原型也是對象,原型也有原型
所有對象來自於Object對象
所有函數來自於Function對象
所有的函數是對象,繼承自Function.prototype
Function.prototype是對象,繼承自Object.prototype
Object.prototype是對象,繼承自null
原型系統中
操作對象的成員
讀取操作:從當前向上尋找,找到爲止
修改操作:在當前找,找到就用,沒有找到就創建