***函數:封裝一項任務的步驟清單的代碼段,再起一個任務名
何時使用:發現一項任務,被反覆調用,要先將任務步驟封裝爲一個函數,再反覆調用
如何聲明函數:
function 任務名([參數變量類表]){
步驟清單代碼段
[return返回值]
}
如何調用函數:函數名([參數值類表])
強調:
1.函數只有被調用時纔會被執行
2.函數可被反覆調用 --代碼重用
參數變量:專門接收方法執行必須的數據變量
何時使用:如果一個函數,必須提供指定數據,才能正常執行時,需要提供幾個數據,就定義幾個參數接收
如何定義參數:不需要var,直接在函數名後的括號中定義參數名 --每個參數名之間用逗號分割
何時,如何傳入參數值:調用時,按照參數定義的個數和順序傳入
爲什麼使用參數:參數可讓方法變的更加靈活
***內存中函數的生命週期:
1.定義時:將函數直接封裝在一個對象中保存 --函數對象
***函數名:其實是指向函數對象的一個變量
***定義時,不會讀取函數的內容
2.調用時:在執行環境中增加一個當前函數的執行環境對象,纔會逐行讀取並執行函數的內容
3.調用後:函數的執行環境和活動對象,彈出
***作用域:一個變量的可用範圍
本質其實是一個存儲多個變量的對象
2種:
1.全局作用域:專門保存全局變量的對象
全局變量:在任何時候,任何位置都可以被訪問
2.函數作用域:專門保存函數內部的局部變量的對象 --活動對象
局部變量:
2類:
1.參數變量
2.在函數聲明的變量(var)
--只在函數調用時的函數內部纔可以使用
筆試題:
例1:局部變量
var n=100; function fun(n){ n++; console.log(n); } fun(100);//101 console.log(n);//100
例2:使用全局作用域:
var n=100; function fun(){ n++; console.log(n); } //沒有自帶的n,到全局中找n,將n帶入,結果爲 fun();//101 console.log(n);//101
返回值:函數調用的執行結果
何時使用:只要函數的執行,需要明確的返回值結果時;要看調用者是否需要獲得執行結果
如何定義返回值:在函數定義結尾:return 返回值
如何獲得返回值:
調用時: var 變量=函數名(xxx);
***按值傳遞:兩變量間賦值或向函數中傳遞參數時,都是將原變量中的值複製一個副本給對方
即:修改一方,另一方不熟影響
例1:
var n=100; var m=n;//按值傳遞:n將自己的值,複製一個副本給m,該m,不影響n,反之亦然 n++; console.log(m);//100 兩個互不影響
例2:
function buy(card){ card-=3; console.log(card); } var card=10; buy(card);//7 console.log(card);//10
***聲明提前:在正式執行程序前,都會先預讀所以var 聲明的變量
function聲明的函數,集中到當前作用域的頂部集中聲明 ***賦值留在原地***
定義函數的第二種方式:
var 函數名=function(參數){函數體;return 返回值}
=100
例:
var fun; fun=function(){ return 1; }; console.log(fun());//1 fun=function(){ return 2; }; console.log(fun());//2 fun=100; console.log(fun);//100 console.log(fun());//報錯
第二種方法,函數定義不會被提前,僅函數名提前
聲明函數,整體(函數名+函數定義)提前
問題一:如果一個表達式或者函數有結果,就可直接當一個值用
問題二:如果傳入參數個數不符,不會報錯;個數超了;多出的沒用;個數不夠,未接到值得參數變量,默認值undefined
問題三:在函數內,爲沒聲明過的變量賦值,變量會被自動創建在全局 -->危險
強烈建議:所有變量使用前,必須用var聲明
問題四:return 特點:
1.return 與返回值之間不能加回車
2.return 不能放在其他表達式中間使用
*全局函數:ES標準中規定的,瀏覽器廠商已經實現的,不需要任何對象即可直接調用的函數
干擾項:BOM,凡是在BOM階段講的都不是全局函數
手冊中:JavaScript->JavaScript對象->jsfunctions
encodeURI:對包含多字節符的url字符串編碼爲單字節符組成
decodeURI:將encodeURI編碼後的字符串,解碼爲原文
爲什麼:url不允許包含多字節字符:比如漢字
問題:url還不允許包含保留的特殊符號:比如:/
解決:encodeURIComponent/decodeURIComponent
eval:專門執行字符串格式的js語句 --eval("alert(‘hello’)")
還可計算字符串格式的表達式的值
infinity:無窮的的意義
除數爲0,(js中除數可以爲0),結果爲infinity,無窮大,可參與關係運算
函數:isFinite(num):專門判斷一個數字是否在有效範圍內
*分支結構:
程序分爲3種結構: 順序 分支 循環
順序:除去聲明提前,其餘代碼默認都從上向下順序執行
分支:根據不同的條件,執行不同的代碼
循環:讓程序反覆執行一段相同代碼
分支情況:3種情況:
1.一個條件,一件事,滿足條件就做,不滿足就不做
如果操作簡單:利用短路:條件&&(操作)
如果操作複雜:if(條件){操作代碼}
//如果滿足條件,就執行操作
2.一個條件,兩件事,就滿足條件做第一件事,不滿足做另一件事
如果操作簡單:三目:條件1?操作1:操作2;
如果操作複雜:if(條件){
滿足才執行的代碼
(如果前一個條件滿足,則不再繼續判斷)
}else{
不滿足才執行的代碼
}
完整的分支結構,都是必須且只能多選一執行
3.多個條件,多個事,多選一執行,可一件都不執行
簡單操作:三目:條件1?操作1:
條件2?操作2:
條件3?操作3:
如果複雜操作:if(條件1){
操作1
}elseif(條件2){
操作2
}elseif(條件3){
操作3
}elseif(條件4)
。。。。
}
強調:2點
1.最後的else可省略,一旦所有條件都不能滿足,則什麼都不做
2.條件可以任意關於運算或邏輯運算
只要返回true和false的函數或表達式,都可當條件用