函數(shù)的定義和調(diào)用
函數(shù)的定義:function 函數(shù)名(參數(shù),參數(shù)){ 陵吸。忿晕。。} ? 函數(shù)體內(nèi)的語(yǔ)句一旦執(zhí)行到return ?就執(zhí)行完畢 ? 返回結(jié)果 ?沒(méi)有return ?函數(shù)執(zhí)行完畢也會(huì)返回結(jié)果 ?結(jié)果為undefined ?
函數(shù)就是一個(gè)對(duì)象 ?函數(shù)名可以視為指向該函數(shù)的變量 ? var 變量 = function(參數(shù)){吞歼。圈膏。。} ? 這是一個(gè)匿名函數(shù) ?他沒(méi)有函數(shù)名 ?但是這個(gè)函數(shù)賦值給了變量 ?通過(guò)變量就可以調(diào)用函數(shù)
調(diào)用函數(shù)
函數(shù)名(參數(shù))調(diào)用函數(shù) ?參數(shù)按順序傳入 ?函數(shù)可以任意個(gè)篙骡,就算函數(shù)體內(nèi)用不到這個(gè)參數(shù) ?比定義的少也可以 ?返回NaN(此時(shí)函數(shù)的參數(shù)將是undefined ?稽坤,所以結(jié)果為NaN)
要避免收到undefined 可以對(duì)參數(shù)進(jìn)行檢查
if(typeof 參數(shù) 丈甸!==“number”){ ? throw ‘not ?a ?number ?’}
arguments ?關(guān)鍵字 ?只在函數(shù)內(nèi)部起作用 ?并且永遠(yuǎn)指向當(dāng)前函數(shù)的調(diào)用者傳入的所有參數(shù) ?
arguments類似array ?但不是array
foo(a[,b],c);
接收2.3個(gè)參數(shù) ?b可選參數(shù) ?如果只有2個(gè)參數(shù) ?b默認(rèn)為null
function foo(a,b,c){if(arguments.length ===2){ ? c =b; ? ?b = null;}}
rest參數(shù)
function foo(a,b尿褪,c睦擂,...rest){console.log(rest);} ?foo(1,2,3,4,5); ? rest只能寫(xiě)在最后 ? ?先綁定原有參數(shù) 多余的參數(shù)以數(shù)組的形式傳給變量rest ? 如果傳入?yún)?shù)沒(méi)滿定義參數(shù) ? 那么rest接收一個(gè)空數(shù)組
變量的作用域
函數(shù)內(nèi)申明的變量 ?作用于整個(gè)函數(shù)體 ?外部不可引用
不同函數(shù)各自申明同一個(gè)變量 ?只在各自的函數(shù)體內(nèi)起作用 ?不同函數(shù)體內(nèi)的同名變量互相獨(dú)立,互不影響 ? ?內(nèi)部函數(shù)可以訪問(wèn)外部函數(shù)定義的變量 ?反過(guò)來(lái)這不行 ? ?內(nèi)外函數(shù)的變量名相同 從內(nèi)向外 ?外部的變量將被屏蔽 ?
變量的提升 ? ? 在函數(shù)內(nèi)部首先申明所有的變量?
全局作用域
不在任何函數(shù)內(nèi)定義的變量 ?實(shí)際上就是被綁定到window的一個(gè)屬性 ? ?eg
var a = 'xiaoqi';
alert(a); ? alert(window.a);
函數(shù)實(shí)際上也是一個(gè)全局變量 ?并綁定到window對(duì)象 ? alert()函數(shù)也是window的一個(gè)變量
名字空間
避免命名沖突 ?定義一個(gè)唯一的全局變量 ?把所有的變量和函數(shù)綁定在一個(gè)全局變量中
局部作用域
在for循環(huán)中是無(wú)法定義具有局部作用域的變量
常量
用關(guān)鍵字const來(lái)定義常量 ?const和let都具有塊級(jí)作用域 ? ?eg: ? const pi= 3.14杖玲;
方法
在一個(gè)對(duì)象中綁定函數(shù) ? ?這個(gè)函數(shù)就叫方法但是它在內(nèi)部使用了this關(guān)鍵字
this是一個(gè)變量 ? 他始終指向當(dāng)前對(duì)象 ?this.屬性就可以拿到你要的屬性?
apply 把參數(shù)打包成Array再傳入
call 把參數(shù)按順序傳入
裝飾器 ??
利用apply()顿仇,可以動(dòng)態(tài)改變函數(shù)的行為
高階函數(shù)
一個(gè)函數(shù)可以作為另一個(gè)函數(shù)的參數(shù)?
map
調(diào)用map()方法,傳入我們自己的函數(shù) ?得到一個(gè)新的數(shù)組作為結(jié)果 ??
利用map()可以將所有數(shù)字轉(zhuǎn)化為字符串?
eg:var arr = [1,2,3,4,5,6,7]; ? ? arr.map(String);
reduce()這個(gè)函數(shù)必須接受兩個(gè)參數(shù) ?把結(jié)果繼續(xù)和下一個(gè)元素做累計(jì) ?作用在數(shù)組上
var arr = [1,3,5,7,9]; ? arr.reduce(function(x, y){ ? ? returnx + y; ? });
上一個(gè)的結(jié)果和序列下一個(gè)元素做累計(jì)計(jì)算
var ?arr = [1,3,5,7,9]; ? arr.reduce(function(x, y){ ?returnx *10+ y; ? });//得到結(jié)果13579摆马;
return arr.map(function(s){
return s.toLowerCase();
}).map(function(s){
return s[0].toUpperCase()+s.slice(1);
});
//將名字首字母大寫(xiě) ?后面小寫(xiě) ? 規(guī)范名字
r = arr.map(function(s){
return parseInt(s);
});
//將字符串變成整數(shù)夺欲。
filter
用于把數(shù)組的某些元素過(guò)濾掉 ?然后返回剩下的元素 ?和map()類似 ? filter()把傳入的函數(shù)依次作用于每個(gè)元素 ?根據(jù)返回值決定去留該元素
var arr = [1,2,4,5,6,9,10,15];
var r = arr.filter(function(x){
return x%2!==0;});
console.log(r);
回調(diào)函數(shù)
filter()接收的回調(diào)函數(shù),其實(shí)可以有多個(gè)參數(shù) 今膊,回調(diào)函數(shù)還可以接收另外兩個(gè)參數(shù)些阅,表示元素的位置和數(shù)組本身
var arr = [1,2,3,4,5,6,7,8,9];
var r = arr.filter(function(element,key,self){
var isPrimes = true;
if (element<2) {
isPrimes = false;
}else{
for (var i in self) {
if (self[i] !=1&&element!=self[i]&&element %self[i] === 0) {
isPrimes = false;
break;
}
}
}
return isPrimes;
});
console.log(r);
//[2,3,5,7];
sort
根據(jù)ASCII碼排序