目录
一、创建函数
- 封装到函数中的代码不会立即执行,会在函数调用的时候执行
- 调用函数语法,函数对象()
- 当调用函数时,函数中封装的代码会按照项序执行
-
使用typeof检查一个函数对象时,会返回function
1.使用构造函数创建函数(了解)
var fun = new Function(
"console.log('创建函数');"
);
// 使用typeof检查一个函数对象时,会返回function
console.log(typeof fun); // function
fun(); // 调用函数
2.使用函数声明创建函数
语法:
function 函数名([形参1, 形参2...形参n]) {
语句
...
}
function fn() {
console.log("哈哈哈");
alert("嘟嘟嘟");
document.write("创建函数");
}
fn(); // 调用函数
3.使用函数表达式创建函数(匿名函数赋值给变量)
语法:
var 函数名 = function([形参1, 形参2...形参n]) {
语句
...
}
var fun1 = function() {
console.log("匿名函数中封装的代码");
};
fun1(); // 调用
二、函数的参数
1.形参
- 可以在函数的()中来指定一个或多个形参(形式参数)
- 多个形参之间使用 , 隔开,声明形参就相当于在函数内部声明了对应的变量,但是并不赋值
function sum(a, b) {
console.log(a + b);
}
2.实参
- 在调用函数时,可以在()中指定实参(实际参数),实参将会赋值给函数中对应的形参
- 调用函数时,解析器也不会检查实参的数量,多余实参不会被赋值
- 如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined
function sum(a, b) { // 形参
console.log(a + b);
}
// 实参
// 在调用函数时,可以在()中指定实参(实际参数),实参将会赋值给函数中对应的形参
sum(3, 5); // 8
sum(34, 354); // 388
// 调用函数时,解析器也不会检查实参的数量,多余实参不会被赋值
sum(2, 3, 4); // 5
// 如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined
sum(5); // NaN
注:
- 调用函数时解析器不会检查实参的类型,所以要注意,是否有可能会接收到非法的参数,如果有可能则需要对参数进行类型的检查
- 函数的实参可以是任意的数据类型
三、返回值
- 可以使用return来设置函数的返回值, return后的值将会作为函数的执行结果返回,可以定义一个变量来接收结果
- 在函数中,return后面的值都不会执行
- 如果return语句后不跟任何值就返回一个undefined,
- 如果函数中不写return,则也会返回undefined
-
return 只能在函数内部使用。
- return后可以跟任意类型的值 如:return "hello"
function sum(a, b, c) {
var d = a + b + c;
return d;
// alert("弹出结果") 不会执行
}
// 调用函数
// 变量result的值就是函数的执行结果
var result = sum(1, 2, 3);
console.log(result);
例:定义一个函数,判断一个数字是否是偶数,如果是返回true,否则返回false
function oushu(num) {
// if (num % 2 == 0) {
// return true;
// } else {
// return false;
// }
return num % 2 == 0;
}
var re = oushu(3);
console.log(re); // false
实参可以是一个对象或函数,例:创建函数,可以在控制台中输出一个人的信息,可以输出人的name age gender address
function message(obj) {
console.log("我是" + obj.name + ",今年" + obj.age + "岁," + "性别" + obj.gender + ",我住在" + obj.address);
}
var obj = {
name: "koko",
age: 12,
gender: "男",
address: "成都"
}
message(obj); // 我是koko,今年12岁,性别男,我住在成都
// 将函数作为一个参数
function fun(a) {
a(obj);
}
fun(message); // 我是koko,今年12岁,性别男,我住在成都
比较area()和area的区别: (重点)
area():
-
调用函数
-
相当于使用的函数的返回值
area:
- 函数对象
- 相当于直接使用函数对象
四、return
1.return 结束后面的所有语句
function fn() {
alert("你好");
for (var i = 0; i< 5; i++) {
console.log(i);
if (i == 3) {
return; // 直接结束整个函数
}
}
alert("你好吗"); // 不会被执行
}
2.返回值可以是任意的数据类型
function fn1() {
return 11;
}
var a = fn1(); // 将fn1的返回值赋值给a
console.log(a); // 11
(1)返回值也可以是对象
function fn1() {
// var obj = {name: "我是一只大象"}
// return obj;
return {name: "我是一只大象"};
}
var a = fn1(); // 将fn1的返回值赋值给a
console.log("a = " + a.name); // a = 我是一只大象
(2)返回值也可以是函数
function fn2() {
function fn3() {
alert("大象鼻子");
}
return fn3; // 返回的是fn3这个函数 (重点)
// return fn3(); 返回的是fn3这个函数的返回值 (重点)
}
a = fn2(); // 将fn2的返回值赋值给a
a(); // 返回值为 大象鼻子 可以直接写为fn2()();
console.log(a); // 返回fn3时,值为function; 返回fn3()时,值为undefined,因为fn3里面没有返回值
五、立即执行函数
立即执行函数: 函数定义完,立即被调用. 立即执行函数往往只会执行一次
(function(a, b) { // 形参
console.log(a + b);
})(3, 4) // 7 传递实参
方法:直接在匿名函数外面包裹一层小括号,然后后面再加上一个小括号用于传递实参