標籤:形參與實參 產生 服務 指令碼 引用 技術 服務區 java 全域
1. 函數構造方法: js中所有函數的建構函式都是Function,包括Function本身,(Function是自己的執行個體,也是自己的建構函式)
證明:
Function.prototype === Function.__proto__
1.1 函式宣告: function 函數名(){}1.2函數運算式: var 函數名 = function(){};1.3建構函式: var 函數名 = new Function(參數1,參數2,函數體);
1. 不傳參數建立出來的是空函數. 2. 一個參數:函數體(字串). 3. 傳多個參數的情況:(字串). 例:簡單的求兩個數和:
var sum = new Function(‘a‘,‘b‘,‘return a + b‘); sum(1,2);
注:傳參數時候可以使用:拼接字串或反引號(ES6方法)或者建立模板引擎
2. 訪問函數的方法:2.1. 函數調用模式: 函數名();
this:指向window
2.2. 方法調用模式: 對象.函數名();
this:誰調用就指向誰
2.3. 建構函式調用模式 :new 函數名();
this:指向new出來的對象
2.4. 上下文調用模式 : 解決this作為左值不能賦值的問題
左值(LValue):能正常的在等號左邊被賦值的值 右值(RValue):能正常的在等號右邊賦值的值* 文法:1 函數名.call(this指向,實參,實參) 注意: 1當傳入的第一個參數為undefined或Null時,指向的是window 2當傳入的第一個參數為單一資料型別時,this指向該資料的基本封裝類型* 文法:2 函數名.apply(this指向,數組或偽數組) 注意:第一個參數與call文法相同,後面的數組參數中的元素拆解後傳給函數
3. eval(符合js文法規範的字串) 函數:
* 功能:將字串轉化為代碼並執行;* 1.eval與Function()的共同點:將字串轉化為代碼; 2.不同點:Function()轉化成代碼之後是函數,需要手動調用才能執行,eval()會直接執行* Function與eval的問題 1.需要預解析,執行效率問題 2.安全性問題(如果別人輸入的內容符合規範,可以進行跨站指令碼攻擊xss) 3.eval會將json字串中的{}當做程式碼片段處理,所以會報錯 處理:在json字串外面拼接小括弧易形成一段完整的語句; 把變數聲明也寫在eval參數中:
var jsonStr = {"key":"value"}; eval("var obj =" + jsonStr);
4. json2.js:引入解決IE7及以下版本JSON未定義問題。
json2.js提供了json的序列化和還原序列化方法,可以將一個json對象轉換成json字串,也可以將一個json字串轉換成一個json對象。源碼地址:https://github.com/douglascrockford/JSON-js
4.1. json2.js使用基本模型:
//在頁面中添加json2.js的引用。
<--引入json2.js檔案-->
<script type="text/javascript" src="JS/json2.min.js"></script>
//序列化方法
var jsonObj = { id: ‘01‘, name: ‘Tom‘ };
JSON.stringify(jsonObj); //還原序列化方法 var jsonString = ‘{ "id": "01", "name": "Tom" }‘; JSON.parse(jsonString);
5. 函數對象的成員
* arguments * caller 函數在哪個環境中調用的,就指向誰,如果函數是在全域環境下調用的,指向Null* length 形參個數* name 函數函式宣告與函數運算式建立出的name為函數名,new Function()建立的函數name為‘anonymity‘
5.1. arguments對象:是一個函數內部的對象(執行環境在函數內部),是偽數組.
1 偽數組:有length屬性(但是不會動態改變),可以被遍曆,但沒有數組的方法. 2 arguments對象: * 作用:當函數調用的時候會將所有實參一次存入偽數組中(無論形參與實參個數是否對應). * 應用情境:當時參數個數不確定的時候,就可以不用寫形參直接用arguments 擷取實參. * 屬性: 1.length 判斷使用者調用函數時輸入的實參個數 2.callee 指向 arguments對象 所在的這個 函數!
6. 重載:overload
重載:根據參數個數的不同,調用相同函數名函數不同的功能;JavaScript沒有重載!不過可以根據arguments屬性的長度判斷來類比重載.
7. 靜態成員與執行個體成員7.1. 靜態成員:通過建構函式去訪問的成員
一般將工具方法,比如($.ajax)設定為靜態成員
7.2. 執行個體成員:通過對象去訪問的成員
一般將於對象相關的成員,比如(.css) 設定為執行個體成員
8. 範圍:8.1. 詞法範圍(靜態範圍): 在代碼寫好的時候,根據代碼的書寫結構確定變數的範圍8.2. 動態範圍: 根據代碼的調用環境確定變數的作範圍. JavaScript沒有動態範圍!!
範圍的意義:保護變數.
8.3. JavaScript代碼執行順序:
1 預解析階段:會對變數的聲明(變數只提升聲明以及函數的聲明提升到其當前範圍的頂部! 變數提升(hoisting) * 函數形參賦值的過程是在 函數與變數提升之前 * 當兩個函數同名的時候兩個函數都會提升 * 當函數與變數同名的時候,會忽略變數聲明,只提升函式宣告 * 就算有多個script標籤,全域範圍也只有一個,但聲明提升是分段的 * 條件式函式宣告在變數提升的時候會將條件是函式宣告當做函數運算式處理只會提升函數名) 注:條件式函式宣告:在條件陳述式中的函式宣告2 自上而下執行
9. 沙箱模式: JS中的沙箱模式通過函數去實現的
沙箱模式的基本模型:
(function(window){ //聲明所有需要的變數 //寫主要的功能代碼 //如果需要,就通過window對象向外界暴露介面 })(window)9.1. 沙箱模式為什麼要把window做為參數傳進去?
1. 有利於代碼壓縮,因為原生的內建對象無法被壓縮,使用形參接收後,形參是可以被壓縮的 2. 實現隔離的思想,外界不直接去使用內部的東西,內部也不直接去訪問外部的任何東西! 3. 沙箱的參數不都是window,而是如果要在沙箱內部使用沙箱外部的東西就需要把該東西當做參數,傳遞進沙箱內部!
9.2. 沙箱模式應用在哪裡?
1. 架構 2. 組件 3. 外掛程式
10. 遞迴
1 定義:在一個函數 通過名字直接或間接地調用自身2 用遞迴解決問題的關鍵點:化歸思想. 例: 斐波那契數列第n項
function fib(n){ if(num <= 2) { return 1; } else { return fib(n - 1) + fib(n - 2); } } console.log(fib(6));
3 * 遞迴的問題:時間複雜度多,產生多次重複計算髮生效率問題 , * 解決方案:可以使用緩衝容器解決; 例: 斐波那契數列第n項
function recursive() { var arr = []; //記錄已經找到的項,作為緩衝,免於遞迴重複計算 return function(n) { if (!arr[n]) { //判斷數組中有沒有這一項,有的話直接返回 if (n <= 2) { arr[n] = 1; } else { arr[n] = outer(n - 1) + outer(n - 2); } } return arr[n]; }}var fib = recursive();console.log(fib(1000));
11. 閉包11.1. 定義: 一個具有封閉的對外不公開的包裹結構, 或空間.(有權訪問另一個函數範圍中的變數的函數)11.2. 概念:可以訪問獨立資料的函數11.3. 作用:
* 1.保護資料 如果直接將資料定義全域中,那麼將對資料失去控制權 使用閉包可以將資料保護起來,外界想要訪問資料,必須通過指定的渠道,而制定渠道的方法,就是建立一個函數,在函數中建立校正機制以保證資料的合理性與安全性. * 2.可以給函數提供私人的變數閉包的基本模型:
function outer(){ var a = 10; var inner = { //將兩個方法封裝為一個對象 getA:function(){ //擷取資料 return a; }, setA:function(形參){ //通過傳入參數,設定資料 //可以在這建立校正機制以保證資料的合理性與安全性 a = 形參; return a; //也可以不返回,只是設定 } } return inner; } var getFun = outer(); //先調用,再賦值,返回的是inner對象 console.log(getFun.getA()); //擷取a console.log(getFun.setA(實參)); //設定a console.log(getFun.getA()); //再次擷取的為修改後的a
執行個體:用延時定時器,逐個列印數字
for (var i = 0; i < 10; i++) { function outer() { var j = i; function inner() { console.log(j); } return inner; } setTimeout(outer(),1000*i); };
11.4. 閉包的問題:不合理的使用會造成記憶體泄露,,因為閉包的記憶體空間會常駐記憶體,造成資源損耗12. JS是單線程的語言: js中的任務: 在執行完主要任務之後才會執行次要任務
*主要任務(主邏輯代碼) *次要任務(例如setTimeout()與setInterval())
13. 緩衝:將資料臨時儲存起來,避免重複計算,以提高使用者訪問效率13.1. 瀏覽器緩衝:
將網站資源在瀏覽器端進行儲存,使用者在請求伺服器的時候,這些被保運的資源直接從本地讀取而不必去服務區讀取,從而提高使用者訪問速度;
13.2. CDN:
* CDN系統能夠即時地根據網路流量和各節點的串連、負載狀況以及到使用者的距離和回應時間等綜合資訊將使用者的請求重新導向離使用者最近的服務節點上。使使用者可就近取得所需內容,解決 Internet網路擁擠的狀況,提高使用者訪問網站的響應速度。CDN的關鍵技術主要有內容儲存和分發技術。* 實現原理:CDN廣泛採用各種快取服務器,在使用者訪問網站時,利用全域負載技術將使用者的訪問指向距離最近的快取服務器上,由快取服務器直接響應使用者請求。
13.3. 資料庫緩衝:
靜態網站的內容都是些簡單的靜態網頁直接儲存在伺服器上,可以非常容易地達到非常驚人的訪問量。但是動態網站因為是動態,也就是說每次使用者訪問一個頁面,伺服器要執行資料庫查詢,啟動模板,執行商務邏輯到最終產生一個你所看到的網頁,這一切都是動態即時產生的。從處理器資源的角度來看,這是比較昂貴的。對於大多數網路應用來說,過載並不是大問題。但是對於中等至大規模流量的網站來說,儘可能地解決過載問題是非常必要的。
13.4. 硬體緩衝:
這是另一個領域的問題,這裡暫時不做具體研究,有機會深入接觸後再作補充
轉自.cnblogs.com/canday/p/6220697
函數及函數最佳化