文章目录
函数基本概念:
函数:
- 函数也是一个对象
- 函数中可以封装一些功能,在需要时可以执行这些功能和代码。
函数也是一个对象
创建函数对象——构造函数创建函数对象
var fun = new Function();
可以将要封装的代码以字符串的形式传递给构造函数
var fun = new Function("console.log('Hello,我是一个函数');");
函数的调用
封装到函数中的代码不会立即执行,调用的时候才会执行
调用语法:函数对象()
fun();
当调用的时候,函数中封装的代码会顺序执行。
函数也是一个对象,它具有对象所拥有的全部方法
eg:插入属性:
fun.hello = "你好";
console.log(fun.hello);
输出:
hello
函数的声明(常用方法)
语法:
function 函数名([形参1,形参2,……,形参n]){
函数体
}
eg:
function fun(){
console.log("hello,我是一个函数");
alert("哈哈O(∩_∩)O");
}
fun();
匿名函数
匿名函数,就是没有名字的函数:
格式:
function(){
函数体;
}
因为匿名函数没有函数名,所以它其实更像一个值,可以将它赋值给变量
通过 变量名();
来调用它。
var fun = function(){
console.log("你好,我是一个函数")
};
fun();
匿名函数的好处是:可以当作一个值随便传递,例如,函数的形参进场使用匿名函数。
函数的参数
可以在函数的()中来指定一个或多个形参(形式参数)
多个形参之间使用,
隔开,声明形参就相当于在函数内部声明了对应的变量但是并不赋值。
形参不需要使用 var
来声明
eg:
function sun(a, b){
console.log()
}
调用:
在调用函数时,可以在()中指定实参(实际参数)
实参将会赋值给函数中对应的形参
sum(123,456);
注意:
- 调用函数时解析器不会检查实参的类型:
所以要注意,是否有可能会接收到非法的参数,如果有可能则需要对参数进行类型的检查 - 调用函数时,解析器也不会检查实参的数量:
多余实参不会被赋值;
如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined。
返回值
使用 return
来返回函数值,需要定义变量来接收结果。
function sun(a, b){
return a+b;
}
var result = sum(123,456);
- return 后的语句不会执行。
- 如果return后不跟任何值,即
return;
,就相当于返回一个undefined;
如果函数中不写return,也会返回undefined。 - return 后可以跟任何类型的值。
习题
判断是否是偶数:
function isOu(num){
return num % 2 == 0;
}
var result = isOu(3);
console.log(result);
对象作为函数参数
当我们的参数过多时,可以将参数封装到一个对象中,然后通过对象传递。
var obj ={
name : "孙悟空",
age : 18,
gender :"男",
address : "花果山"
}
function fun(o){
alert("我叫"+o.name+",我"+o.age+"岁了,我是一个"+o.gender+"人,我住在"+o.address);
}
fun(obj);
输出:
函数做形参
var obj ={
name : "孙悟空",
age : 18,
gender :"男",
address : "花果山"
}
function fun(o){
alert("我叫"+o.name+",我"+o.age+"岁了,我是一个"+o.gender+"人,我住在"+o.address);
}
// fun(obj);
function fun1(a){
alert(a);
}
fun1(fun);
此时 a 就相当于 函数 fun()
输出:
就是说a和fun都指向堆中的同一个函数,a现在也是该函数的函数名,可以直接进行调用:
var obj ={
name : "孙悟空",
age : 18,
gender :"男",
address : "花果山"
}
function fun(o){
alert("我叫"+o.name+",我"+o.age+"岁了,我是一个"+o.gender+"人,我住在"+o.address);
}
// fun(obj);
function fun1(a){
// 注意obj定义在全局作用域中,这里可以直接访问到odj
a(obj);
}
fun1(fun);
输出:
匿名函数做参数
function fun1(a){
console.log(a);
}
fun1(function(){alert("我是匿名函数")});
输出:
ƒ (){alert("我是匿名函数")}
调用函数和函数对象
函数名()
:调用函数,相当于当前函数的返回值
函数名
:函数对象,相当于直接使用函数对象。
返回值类型
返回值可以是对象
function fun(){
var obj ={
name :"孙悟空",
age : 19
}
return obj;
}
var a = fun();
alert(a.name);
输出:
返回值可以使函数
function fun(){
function fun1(){
alert("我是内部函数");
}
fun1();
return fun1;
}
var a = fun();
a();
匿名函数的立即执行
一次性执行:
直接写匿名函数是会报错的:
function(){
alert("这是一个匿名函数");
}
报错:
Uncaught SyntaxError: Function statements require a function name (at title.html:7:9)
正确定义方式:加括号表示是一个整体
(function(){
alert("这是一个匿名函数");
})
调用方法: 函数对象()
(function(){
alert("这是一个匿名函数");
})();
这就是一个立即执行函数:立即执行函数只会执行一次,因为没有函数名,也没有用变量记录,不能调用。
eg2:
(function(a,b){
alert("和是"+(a+b));
})(1,2);
补充:回调函数
像这种函数,由我们创建但是不由我们调用的,我们称为回调函数
如:
arr.forEach(function(){
console.log("hello");
})
我们只是定义了函数(匿名函数),没有调用,但是控制台还是输出了结果,这就说明有人调用了函数,可以理解为是浏览器调用了函数,这种函数就是回调函数。