前言: //function普通函數(shù) function say(){ console.log("hello"); console.log("javaScript"); console.log("hello is me"); } say ();//調(diào)用函數(shù)打印上述文字 //練習:封裝計算1-100之間1-100的和 function R(){ for (var i=1,sum=0;i<=100 ;i++ ){ sum+=i;//for循環(huán)運算 } console.log(sum);//最后是打印sum } R();//所以調(diào)用r之后打印sum,結(jié)果為5050 2)創(chuàng)建帶有參數(shù)的函數(shù) ——function-param //function有參數(shù)函數(shù) //計算任意兩個數(shù)字相加的和 function add(var1,var2){//參數(shù):形參——參數(shù)形式 console.log(var1+var2); } //調(diào)用 add(2,3);//參數(shù):實參——實際接收的參數(shù) //練習:創(chuàng)建函數(shù),封裝計算1-任意數(shù)字之間所有整數(shù)的和,調(diào)用多次 function getsum(b){ for (i=1,sum=0; i<=b;i++ ){ sum+=i; } console.log(sum); } getsum(100); getsum(1004); getsum(10042); //練習:創(chuàng)建函數(shù),封裝計算任意兩個年份之間閏年的個數(shù),調(diào)用多次 function runnian(year,year2){ for (i=year,count=0;i<=year2 ;i++ ){ if (i%4===0 && i%100!==0 || i%400===0 ){ count++; console.log(i,count); } } } runnian(1980,2000); runnian(1880,2100); 3)創(chuàng)建帶有 返回值得函數(shù)——function-return //function帶有返回值的函數(shù) function add(n1,n2){ //返回n1+n2的結(jié)果,用于后期保存,可以理解為如果n1,n2如果有參數(shù)傳進來之后就執(zhí)行n1+n2,然后保存結(jié)果,以便于后續(xù)使用 return n1+n2; } //把函數(shù)的結(jié)果保存下來 var a=add(100,140); console.log("總成績?yōu)椋?+a); //練習:創(chuàng)建函數(shù),傳遞任意年份,返回是否為閏年,如果是返回true,不是返回false;打印該年天數(shù) function year(a){ if (a%4===0 && a%100!==0 || a%400===0){ return true; }//else { 可以省略 return false; } function getdays(a){ if(year(a)){//此處解釋為如果year(a)為真就執(zhí)行以下 return a+"閏年,366天"; }//此處省略else 否則 return a+"不是閏年,365天"; } console.log(getdays(2019));//2019不是閏年,365天 //練習:計算1-任何數(shù)字之間所有整數(shù)階乘的和 //1!+2!+3!+4!+5! //步驟一:計算任意數(shù)字的階乘n-1之間所有整數(shù)的乘積 function R(a){ for (var b=1,num=1;b<=a ; b++){ num*=b; } return num; } //R(4); //步驟2:計算1-n之間所有整數(shù)的和 function getSum(a){ for(var i=1,sum=0;i<=a;i++){ sum+=R(i); } return sum; } console.log(getSum(5));//153 總結(jié):對比break和return的用法 2.作用域——scope //作用域——scope //全局作用域下的變量 var a=1;//全局變量,在此處除function fn(){}函數(shù)以外就是全局。 //函數(shù)作用域下使用var聲明的變量 function fn(){ var b=2;//局部變量 console.log(a);//全局函數(shù)a可以在任意范圍訪問 console.log(b);//2,局部變量可以在函數(shù)作用域內(nèi)訪問 } console.log(a);//1 fn();//1 調(diào)用函數(shù),執(zhí)行函數(shù)體代碼。 console.log(b);//報錯,b is not defined 注意事項:函數(shù)中不使用var聲明的變量,默認是全局變量,可以在函數(shù)的外部訪問,不推薦這樣寫。 //注意事項 function fn2(){ c=3;//函數(shù)中不使用var聲明的變量默認是全局變量,不建議這么寫,造成全局污染 } console.log(c);//即使c是包裹在函數(shù)內(nèi)部,但是沒有聲明的變量默認是全局變量,所以在函數(shù)外部是可以訪問的 fn2();//而調(diào)用fn2()的時候內(nèi)部是什么都沒有寫的,相當于沒有任何函數(shù)體代碼 1)變量提升 //變量提升——全局作用域 var a=1;//聲明變量并賦值 console.log(a); /***************** 實際在程序中應為 ****************/ //變量提升——全局作用域 var a;//聲明提前 a=1;//var a=1中,聲明提前,但是賦值留在原地 console.log(a); //變量提升——函數(shù)作用域 function fn(){ console.log(b); var b=2; } fn(); /***************** 實際在程序中應為 ****************/ //變量提升——函數(shù)作用域 function fn(){ var b;//變量提升到所在函數(shù)作用域前面 console.log(b);//此時只聲明,沒有賦值,所以打印結(jié)果是undefined b=2;//賦值留在原地, } fn();//所以調(diào)用后結(jié)果是undefined 2)函數(shù)的作用域 //函數(shù)作用域 var n=5,m=7; function fn2(){ //var n;提升到所在作用域最前面,相當于此處有一個聲明變量,但是未賦值,只能在內(nèi)部訪問這個n console.log(n);//此時打印的n值為undefined,因為在函數(shù)作用域中var聲明提前到作用域最前面, var n=8;//此處的相當于正常為 n=8 給前面聲明的變量賦值, console.log(n);//此時打印的n值為8 console.log(m);//函數(shù)作用域內(nèi)沒有m,調(diào)用全局的m } console.log(n);//此處打印的n值是全局作用域下的n,值為5 fn2();//此處調(diào)用fn2 3)函數(shù)提升 //函數(shù)提升 fn();//先調(diào)用, function fn(){ console.log(1); } /***************** 實際在程序中應為 ****************/ function fn(){//提升到當前作用域最前端,先創(chuàng)建 console.log(1); } fn();//調(diào)用 3.匿名函數(shù)
沒有名稱的函數(shù) function(){ }
1)創(chuàng)建函數(shù)
function fn1(){ }——函數(shù)聲明
//創(chuàng)建函數(shù)——函數(shù)聲明 function fn1(){ } var a; var fn2=function(參數(shù)){ 函數(shù)體 }——函數(shù)表達式,變量名就是函數(shù)名稱
//創(chuàng)建函數(shù)——函數(shù)表達式 //變量名稱就是函數(shù)名稱 var fn2=function(a,b){ console.log(a+b); } fn2(1,3); //練習:使用函數(shù)表達式創(chuàng)建函數(shù),計算任意兩個數(shù)字之間所有整數(shù)的和 //只能先創(chuàng)建在調(diào)用,因為不存在提升, var add=function(a,b){ for (i=1,sum=0;i<=b ;i++ ){ sum+=i; } return sum; } console.log(add(3,10)); 總結(jié):對比函數(shù)聲明與函數(shù)表達式的區(qū)別
函數(shù)聲明,創(chuàng)建函數(shù)存在提升,可以在任意位置創(chuàng)建,后調(diào)用。
函數(shù)表達式,使用變量創(chuàng)建,只存在變量的提升,不存在函數(shù)提升,只能先創(chuàng)建,再調(diào)用。
2)匿名函數(shù)的自調(diào)用 //匿名函數(shù) //避免全局污染,把變量放到函數(shù)作用域下 (function(){//匿名函數(shù)可以自己調(diào)用自己函數(shù)內(nèi)的數(shù)據(jù),匿名函數(shù)需要用()() var num=2; console.log(num); })(); (function(a,b){//匿名函數(shù)可以自己調(diào)用自己函數(shù)內(nèi)的數(shù)據(jù),匿名函數(shù)需要用()() var num=4; console.log(a+b); })(3,5); 3)回調(diào)函數(shù)——callback //回調(diào)函數(shù) function fn(a){ //實參賦值給形參 //把匿名函數(shù)賦值給a,a就是函數(shù)名稱 //a=function(){ } a(); } fn(function(){ console.log(1); console.log(2); }); //調(diào)用函數(shù)a,執(zhí)行傳遞的函數(shù)體中的代碼 //練習:創(chuàng)建函數(shù),傳遞兩個參數(shù),實參使用匿名函數(shù)的形式傳遞,在匿名函數(shù)的函數(shù)體中添加若干行代碼;在函數(shù)中執(zhí)行匿名函數(shù)中的代碼。 function fun(a,b){ a(); b(); }; fun(function(){ console.log(3); },function(){ console.log(4); }); 4.全局函數(shù)——global //全局函數(shù) //對一個網(wǎng)址中的中文編碼 var str='http://www.jd.com/search?kw=電腦'; var str2=encodeURI(str); console.log(str2);//http://www.jd.com/search?kw=%E7%94%B5%E8%84%91 //對已經(jīng)編碼的網(wǎng)址進行解碼 var str3=decodeURI(str2); console.log(str3);//http://www.jd.com/search?kw=電腦 //isFinite判斷一個值是否為有限值。是—>true 不是-false //2/0-> Infinity(無窮) 0/2->0 console.log(0/2,2/0);//0 Infinity console.log(isFinite(1/3));//true //eval可以執(zhí)行字符串中的表達式 console.log("1+2");//1+2 console.log(eval("1+2"));//3
|
|