函式
函式概述
函式 實際就是多行代碼的抽取(多行代碼會構成特定的功能)(方法)
函式的優點
減少冗余代碼(重復的代碼放在函式里面 在需要的時候呼叫)函式封裝(特定的一些代碼使用函式來包
起來),
提高了代碼的可維護性及可閱讀性
函式的分類
1.系統函式 window里面的所有函式都屬于系統函式 (console.log() alert() prompt()...)
2.內置函式 所有的內置物件里面的函式 都叫內置函式 (Math.pow())
3.自定義函式( 自己定義的函式)
內置函式和系統函式我們更關注于他的使用 自定義函式(定義以及使用)
1.使用function關鍵詞 定義匿名函式(沒有名字的函式)(個人感覺用途不是很廣,因為,他沒有復用價值,只能一次一次的用)
function(形參(可以省略的 可以有多個)){ 函式體(代碼) } //直接呼叫 讓別人(事件)去呼叫(自動呼叫) (function(){ console.log('匿名函式') })()
2.使用function關鍵詞 定義具名函式 (有名字的函式)(宣告試,有名字,可以隨便呼叫)
function 函式名(形參,形參...){ 函式體(代碼) } //宣告 具名函式(第一種) function sayHello(){ console.log('hello') } sayHello() //傳遞引數 function sayHello1(name,age){ //形參是形容的引數 console.log('hello'+name+age) } sayHello1('李四') //傳進的是實參 根據你要的引數個數來傳遞對應的引數個數 //呼叫 // sayHi() //報錯 // console.log(sayHi); undefined //具名函式的變種宣告 (第二種) var sayHi = function(){ console.log('hi') } sayHi()
3.使用new Function方式(賦值法)
var 函式名 = new Function('形參,形參1','函式體') //定義 var sayBye = new Function('console.log("bye bye!!")') //呼叫 sayBye() //傳參 var sayBye = new Function('username','console.log("bye bye!!"+username)') //呼叫 sayBye('李四')
在程式執行之前有個預編譯程序
預編譯
1.他會宣告對應的function和var關鍵詞修飾的變數(開辟記憶體的操作)
2.對應的function的記憶體空間開辟以后他會將對應的代碼塊放到其中 等待呼叫
3.var 修飾的關鍵詞 只會開辟一個空間 并不會進行賦值(默認給他的一個undefined的值)
return
return 回傳對應的資料的 他是在函式內容進行資料回傳的(當你呼叫了return操作后 后面的內容將不
再執行)即:只要有return他就會跳出來,不會在執行后面的相關程式了!
function sum(a,b){ return a+b console.log('不會執行的代碼') } console.log(sum(1,2))//回傳的對應的1+2的結果
如果沒有return關鍵詞 回傳的一個undefined的值,因為你沒有回傳值,所以沒有回傳值,所以sayHi里面啥也沒有所以會輸出undefined
function sayHi(){ console.log('hi') } console.log(sayHi()) //undefined
函式執行程序
1.把對應的開辟的function記憶體里面的代碼塊丟給方法堆疊(執行堆疊)去執行
2.執行堆疊就會自動取執行對應的方法 執行完回傳對應的結果
3.當前結果回傳完畢以后 對應的執行堆疊里面的記憶體空間要進行回收(GC)將這個記憶體空間銷毀
函式作用域
作用域
當前一個變數的作用范圍 分為區域作用域(在一個函式內宣告的 或者是在一段代碼塊內宣告的 他的作
用范圍就是當前的代碼塊)和全域作用域(在對應的全域宣告的 他的作用范圍就是全域的)
作用域鏈(個人理解往上面找,找爸爸借錢,不找兒子借錢)

var a = 20 function fn(){ console.log(a);//undefined 沒有var關鍵詞就20 var a = 10 if(10>9){ console.log(a);//undefined 沒有var關鍵詞就10 var a = 30 if(5>4){ console.log(a);//undefined 沒有var關鍵詞就30 var a = 40 if(a>10){ console.log(a);//40 } } } } fn()
函式的arguments(引數陣列 引數的集合)
arguments是一個偽陣列(有部分的陣列特性)(可以通過length屬性對應的長度 [] 下標來訪問里面的
元素)(個人理解:即有陣列的性質但是,不是陣列)
function sum(){ //不清楚引數個數(無參) // arguments 可以接收里面所有的引數 //獲取里面傳遞的所有的引數 arguments 長度length //下標索引是從0開始的 var result = 0 //遍歷對應的arguments里面的所有的引數 for(var i=0;i<arguments.length;i++){ result += arguments[i] //取出里面的引數進行求和 } return result }
所有的函式都具備arguments (物件)
訪問
1.length屬性訪問長度
2.[] 加下標(從0開始)訪問里面的元素
函式的嵌套
函式的嵌套: 函式內部可以再包含其他函式;
函式之間允許相互呼叫,也允許向外呼叫, 但是不可以呼叫同級函式的嵌套函式;
(個人理解:能給自己兒子借錢,可以給朋友借錢,但是不能給朋友的兒子借錢)
function fn1(){ console.log('函式1'); function fn2(){ console.log('函式2'); // fn1() 沒有結束就是死回圈 } function fn3(){ console.log('函式3'); //呼叫函式2 fn2() } fn2() fn3() } fn1() //函式1 函式2 函式3 函式2
注意事項
函式的抽取 (抽取冗余的代碼)
1.引數 (可變的內容)
2.回傳值 (我們想從這個函式得到什么)
Dom的簡單操作
1.獲取對應的標簽 (通過id獲取)
document.getElementById('id的屬性值')
2.input框的值獲取 value屬性
document.getElementById('input框的id').value //得到input框內的值
3.點擊事件 onclick
element.onclick = function(){ //相關操作 }
示例(以事件做為驅動)
//通過輸入框輸入數值判斷對應的奇偶并列印 <input id="number" type="text"> <button id="btn">判斷奇偶</button> <script> function handlerClick(){ //拿到input框里面的內容 獲取到input框 var inputValue = https://www.cnblogs.com/jxooooolxe/p/document.getElementById('number').value //string型別 // console.log(typeof inputValue); 如果是+法操作必須要先轉型別 //判斷奇偶的操作 if(inputValue%2==0){ console.log('當前為偶數'); }else{ console.log('當前為奇數'); } } //首先需要點擊按鈕 獲取按鍵 加點擊事件 //事件觸發自動呼叫對應的函式 (事件驅動) document.getElementById('btn').onclick = handlerClick </script>
遞回演算法*
遞回可以完成所有回圈做的事情 (但是遞回的效率較低)
遞回三要素
1.找規律
2.找臨界值(沒有規律的值)return
3.自己調自己(在函式內部呼叫自己的函式)
2 4 6 8 10 第100的值是什么
function fn(n){ //一般情況都會有引數 n表示為位數 if(n==1){//沒規律的(一般在前面或者后面) return 2 //回傳具體的值 }else{ //有規律的 回傳對應的規律的公式 return fn(n-1)+2 } } console.log(fn(100))
示例
// 1 3 6 10 15 21 第100位 前一位+對應的位數 = 這個一位的值 function fn1(n){ if(n==1){ return 1 }else{ return fn1(n-1)+n } } console.log(fn1(6)); // 1 2 3 5 8 13 21 第100位值(遞回的效率極低 一般不使用遞回 不推薦 (檔案的遍歷 選單遍歷 深 拷貝)) function fn2(n){ if(n==1){ return 1 }else if(n==2){ return 2 }else{ return fn2(n-2)+fn2(n-1) } } console.log(fn2(7));
bfs 廣度優先搜索 dfs 深度優先搜索(遞回思想)
作業::遞回
//第8題 兔子繁殖問題,設有一只新生兔子,從第四個月開始他們每個月, 月初都生一只兔子, 新生的兔子從第四個月月初開始又每個月生一只兔子按此規律,并假定兔子沒有死亡, n(n<=20)個月月末共有多少只兔子? function fn6(n) { if (n <= 3) { return 1 } else { return fn6(n-1)+fn6(n-3) } } console.log(fn6(11)); //3天就可以生一個兔子兔子后面可以一天生一個 function fn7(n){ if(n<=2){ return 1 }else{ return fn7(n-1)+fn7(n-2) } } console.log(fn7(10));
兔子繁殖問題,設有一只新生兔子,從第四個月開始他們每個月, 月初都生一只兔子, 新生的兔子從第四個月月初開始又每個月生一只兔子按此規律,并假定兔子沒有死亡, n(n<=20)個月月末共有多少只兔子?(題目解釋,有程序)
function fn6(n) { if (n <= 3) { return 1 } else { return fn6(n-1)+fn6(n-3) } } console.log(fn6(11)); //第一串列示月數 第一行表示當前月份中各個月份的兔子的數量 // 1 2 3 4 //1 1 0 0 0 1 //2 0 1 0 0 1 //3 0 0 1 0 1 //4 1 0 0 1 2 //注意這個是第一個兔子生孩子了,所以會有一個還在一月份的兔子 //5 1 1 0 1 3 //6 1 1 1 1 4 //7 2 1 1 2 6//第二個兔子也可以生孩子了 //8 3 2 1 3 9 //9 4 3 2 4 13 //10 6 4 3 6 19 找規律的f(m) = f(n-1) + f(n-3) 然后掏遞回公式咯,一下就出來了
今天的總結完畢咯!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/500548.html
標籤:JavaScript
上一篇:學習Js-day04
下一篇:js中函式的概念及方法
