(一)函数概述
函数声明
1,函数的声明语句
finction f(a,b){
return a+b;
}
2,函数表达式:把匿名函数赋值给一个新的变量
var sum = function hello(a,b){
console.log(sum===hello); //true
return a+b;
}
sum(1,3); //正常运行
hello(1,3); //报错
3,Function构造函数
var fn = new Function(‘x’,’y’,’return x+y’)
console.log(fun(1,2)) //打印3
函数返回值
函数没有返回值,则调用的结果是返回undefined
//捕获异常,了解就行,不是所有的代码之后的return之后的语句都不执行
function test(){
try{
console.log(x); //报错
return 1;
}catch(e){
alert(e); //显示错误
return 2;
}finally{
return 0;
}
}
console.log(test()); //不论是否有错误,返回值始终为0
函数调用模式
函数有四种调用方式:函数调用模式,方法调用模式,构造调用模式,间接调用模式
//this的指向问题:当作普通函数调用,this指向window
//当作构造函数调用,this指向当前函数
//当作对象的方法,这个this一般指向当前对象
1。函数调用模式
函数中的this在非严格模式下指向window,在严格模式下指向undefined
2。方法调用模式
var obj = {
//fn是obj对象的方法
fn:function(){
console.log(this); //指向当前的obj对象
console.log(’hi, there’);
}
}
obj.fun();
3。构造调用模式
function fn(){
this.a = 1;
}
var obj = new fun();
4。间接调用模式call({},1,2). apply({},[1,2])
var obj = {};
function fun(a,b){
return a+b;
}
console.log(fun(1,2));
//相当于执行console.log(fun.call(obj,1,2));
//对比:console.log(fun.apply(obj,[1,2]));
call()方法会改变指向
函数参数
严格模式下不允许同名形参,会报错
非严格模式下允许同名形参,但是只会识别最后一个
实参比形参个数少,剩下的形参都会设置为undefined
实参比形参个数多,考虑arguments,注意arguments不是一个真正的数组,它是类数组,可以用[]的形式来访问每一个元素。
函数不存在重载
重载:定义相同的函数名,传入的不同参数
在js中函数不存在重载现象。
(二)函数参数传递
基本数据类型
在向参数传递基本数据类型的值时,被传递的值会被复制到一个局部变量
引用数据
在向参数传递引用数据类型的值时,会把这个值在内存中的地址直接复制给局部变量
跟内存地址有关,我比较晕。
(三)apply和call方法
每个函数中都包含两个非继承而来的方法,两个方法都会改变this的指向,区别是obj参数之后的不一样
在非严格模式下,如果使用call()或者apply(),传入一个null或者是undefined,会被转换成一个全局对象window
在严格模式下,函数的指向始终是指定的值。传null就是null,传undefined就是undefind。
- 找出数组的最大元素
let arr = [1,2,3,4,54];
Math.max.apply(null,arr);
- 将类数组(比如arguments)转换成为真正的数组
function add(){
var arr = Array.prototype.slice.apply(arguments);
console.log(arr);
}
add(1,2,34,3)
- 数组追加
var arr = [];
Array.prototype.push.apply(arr,[1,2,3,4]);