函数的定义和调用
函数的定义:function 函数名(参数,参数){ 。。。} 函数体内的语句一旦执行到return 就执行完毕 返回结果 没有return 函数执行完毕也会返回结果 结果为undefined
函数就是一个对象 函数名可以视为指向该函数的变量 var 变量 = function(参数){。。。} 这是一个匿名函数 他没有函数名 但是这个函数赋值给了变量 通过变量就可以调用函数
调用函数
函数名(参数)调用函数 参数按顺序传入 函数可以任意个,就算函数体内用不到这个参数 比定义的少也可以 返回NaN(此时函数的参数将是undefined ,所以结果为NaN)
要避免收到undefined 可以对参数进行检查
if(typeof 参数 !==“number”){ throw ‘not a number ’}
arguments 关键字 只在函数内部起作用 并且永远指向当前函数的调用者传入的所有参数
arguments类似array 但不是array
foo(a[,b],c);
接收2.3个参数 b可选参数 如果只有2个参数 b默认为null
function foo(a,b,c){if(arguments.length ===2){ c =b; b = null;}}
rest参数
function foo(a,b,c,...rest){console.log(rest);} foo(1,2,3,4,5); rest只能写在最后 先绑定原有参数 多余的参数以数组的形式传给变量rest 如果传入参数没满定义参数 那么rest接收一个空数组
变量的作用域
函数内申明的变量 作用于整个函数体 外部不可引用
不同函数各自申明同一个变量 只在各自的函数体内起作用 不同函数体内的同名变量互相独立,互不影响 内部函数可以访问外部函数定义的变量 反过来这不行 内外函数的变量名相同 从内向外 外部的变量将被屏蔽
变量的提升 在函数内部首先申明所有的变量
全局作用域
不在任何函数内定义的变量 实际上就是被绑定到window的一个属性 eg
var a = 'xiaoqi';
alert(a); alert(window.a);
函数实际上也是一个全局变量 并绑定到window对象 alert()函数也是window的一个变量
名字空间
避免命名冲突 定义一个唯一的全局变量 把所有的变量和函数绑定在一个全局变量中
局部作用域
在for循环中是无法定义具有局部作用域的变量
常量
用关键字const来定义常量 const和let都具有块级作用域 eg: const pi= 3.14;
方法
在一个对象中绑定函数 这个函数就叫方法但是它在内部使用了this关键字
this是一个变量 他始终指向当前对象 this.属性就可以拿到你要的属性
apply 把参数打包成Array再传入
call 把参数按顺序传入
装饰器
利用apply(),可以动态改变函数的行为
高阶函数
一个函数可以作为另一个函数的参数
map
调用map()方法,传入我们自己的函数 得到一个新的数组作为结果
利用map()可以将所有数字转化为字符串
eg:var arr = [1,2,3,4,5,6,7]; arr.map(String);
reduce()这个函数必须接受两个参数 把结果继续和下一个元素做累计 作用在数组上
var arr = [1,3,5,7,9]; arr.reduce(function(x, y){ returnx + y; });
上一个的结果和序列下一个元素做累计计算
var arr = [1,3,5,7,9]; arr.reduce(function(x, y){ returnx *10+ y; });//得到结果13579;
return arr.map(function(s){
return s.toLowerCase();
}).map(function(s){
return s[0].toUpperCase()+s.slice(1);
});
//将名字首字母大写 后面小写 规范名字
r = arr.map(function(s){
return parseInt(s);
});
//将字符串变成整数。
filter
用于把数组的某些元素过滤掉 然后返回剩下的元素 和map()类似 filter()把传入的函数依次作用于每个元素 根据返回值决定去留该元素
var arr = [1,2,4,5,6,9,10,15];
var r = arr.filter(function(x){
return x%2!==0;});
console.log(r);
回调函数
filter()接收的回调函数,其实可以有多个参数 ,回调函数还可以接收另外两个参数,表示元素的位置和数组本身
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
根据ASCII码排序