1、函数的概念
在JS里面,可能会定义非常多的相同代码或者功能相似的代码,这些代码需要大量重复使用
函数:就是封装一段可被重复调用执行的代码块。通过代码块可以实现在需要的的重复使用,使用typeof检查一个函数对象时,会返回function
函数的封装是把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口,简单理解:将很多衣服打包到一个行李箱,jQuery就是一个函数封装库,对外暴露一个顶级对象$
2、函数的使用
函数在使用时分为两步:声明函数和调用函数
(1)、声明函数(创建函数)三种方式
第一种方式 创建一个构造函数对象
——我们在实际开发中很少使用构造函数来创建一个函数对象
——可以将要封装的代码以字符串的形式传递给构造函数
—— 封装到函数中的代码不会立即执行,函数中的代码会在函数调用的时候执行
构造函数是一个函数,当使用new关键字调用时,它用于创建对象并初始化对象的属性和方法
<script>
var fun = new Function("console.log('hello 这是我的第一个函数')");
console.log(typeof fun);//function
fun();
</script>
第二种方式 使用函数声明来创建一个函数(常用)
function 函数名([形参1,形参2,形参3,形参4....形参n]){
执行语句.....
}
<script>
function fun2() {
console.log("这是我的第二个函数~~~");
alert("hahahaha");
document.write("wuwuwuwu");
}
</script>
第三种方式 使用函数表达式来创建一个函数(匿名函数)
var 变量名=function([形参1,形参2,形参3,形参4....形参n]){
语句.....
}
注意:变量名不是函数名
<script>
var fun3 = function () {
console.log("我是匿名函数中的封装的代码");
}; //相当于赋值语句
fun3(); //调用函数
</script>
注意:
由于函数一般是为了实现某个功能才定义的,所以通常我们将函数名命名为动词,例如getsum
(2)、调用函数
调用函数语法:变量名/函数名()
当调用函数时,函数中封装的代码会按照顺序执行
课堂小练习:1、利用函数计算1-100之间的累加和
3、函数的参数
(1)、参数
在声明函数时,可以在函数名称后面的小括号里添加一些参数,这些参数是形参,而在调用该函数时,同样也需要传递相应的参数,这些参数被称谓实参。
形参:形式上的参数,函数定义的时候,传递的参数,当前并不知道是什么,用来接收实参的,形参类似一个变量,声明了并未赋值,多个形参之间用逗号隔开
实参:实际上的参数,函数调用的时候传递的参数,实参是传递给形参,相当于给形参赋值
参数的作用:在函数内部某些值不能固定的时候,我们可以通过参数在调用函数时传递不同的值进去
语法结构:
function 函数名(形参1,形参2····形参n){ //声明函数的小括号里的是形参(形式上的参数)
执行语句.....
}
函数名(实参1,实参2····)//在函数调用的小括号里面是实参(实际参数)
课堂小练习:1、利用函数求任意两个数的和
(2)、形参和实参匹配的问题
如果形参和实参的个数一致,则正常输出结果
如果实参的个数多于形参的个数,会取形参的个数
如果实参的个数小于形参的个数,多余的形参默认定义为undefined
调用函数时,解析器不会检查实参的类型,所以要注意,是否有可能会接收到非法的参数,函数的实参可以是任意的数据类型
建议形参和实参个数一致
(3)、实参可以是任何类型
——可以是一个对象,当我们的参数过多时,可以将参数封装到一个对象中,然后通过对象传递
——实参可以是一个对象,也可以是一个函数
<script>
//将参数封装到对象中传递
function sayhello(o) {
//console.log("o="+o);//对象
console.log("我是" + o.name + ",今年" + o.age + "岁了," +
"我是一个" + o.gender + "人" + ",我住在" + o.address);
}
//创建一个对象
var obj = new Object();
obj.name = "孙悟空";
obj.age = 18;
obj.gender = "男";
obj.address = "花果山";
sayhello(obj); //可以直接全部赋值
//实参可以是一个函数
function fun(a) {
//console.log("a="+a);
a(obj);
}
fun(sayhello);
/*
sayhello()
-调用函数
-相当于使用的函数的返回值
-机器作出的东西
sayhello
-函数对象
-相当于直接使用函数对象
-机器
*/
</script>
1、函数的返回值return
(1)、返回值语法结构:
function 函数名(){
return 需要返回的结果
}
函数名()
//需求:输入一个数,求1-这个数的和,在这个基础上进行+1,-1,*1,/1
var num = +prompt('输入一个数');
function getSum(num) {
var sum = 0;
for (var i = 1; i <= num; i++) {
sum += i
}
console.log(sum)
return sum;
}
var res= getSum(num)
console.log(res+1)
(2)、返回值注意事项:
函数只是实现某种功能,最终的结果需要返回给函数的调用者(谁调用函数,函数实现结果功能反馈给谁),函数名()=return 后面的结果,通过return实现的;可以定义一个变量,让return来接受该结果
在函数中,return之后的语句就都不会执行,有终止函数的作用
return只能返回一个值,多个值,返回的是最后一个值。如果有需求返回多个值,可以将多个值放入数组或者对象里
return后可以跟任意类型的值
如果return后不跟任何值,就相当于返回一个undefined
如果函数中不写return,则也会返回undefined
<script>
// 需求:创建一个函数,用来计算三个数的和
function sum(a, b, c) {
var d = a + b + c;
//console.log(d);
//alert(d);
return d;
}
//调用函数,变量result的值就是函数的执行结果
var result = sum(4, 7, 8);
//函数返回什么,result的值就是什么
console.log("result=" + result);
</script>
(3)、返回值类型
返回值可以是任意的数据类型,也可以是一个对象,函数
<script>
//1:返回值对象
function fun2() {
//return 10;
var obj = { name: "沙和尚" }
return obj;//return {name:"沙和尚"}
}
var a = fun2();
console.log("a=" + a);
//2:返回值是函数
function fun3() {
//在函数内部还可以声明一个函数
function fun4() {
alert("我是fun4");
}
//将fun4函数作为返回值返回
return fun4;
}
a = fun3();//将箱子里的冰淇机器赋值,也就是fun4
a=fun3;//与上面的区别,整个fun3函数赋值
console.log(a);
</script>
(4)、break、continue、return的区别:
break、continue、return的区别:
break:结束当前的循环体(for、while)
continue:跳出本次循环,继续执行下次循环(for、while)
return:不仅可以退出循环,还可以返回return语句中的值,同时还可以结束当前循环体内的代码
<script>
function fun() {
alert("函数要执行了~~~");
for (var i = 0; i < 5; i++) {
if (i == 2) {
break;//退出当前的循环
continue;//用于跳过当次循环
return;//使用return可以结束整个函数
}
console.log(i);
}
alert("函数执行完了~~~");
}
//fun();
</script>
课堂小练习:1、利用函数求任意两个数的最大值
2、arguments的使用
在调用函数时,浏览器每次都会传递两个隐含的参数:
1:函数的上下文对象 this
2:封装实参的对象 arguments
当我们不确定有多少个参数传递的时候,可以使用arguments来获取,在JS中,arguments实际上它是当前函数的一个内置对象。所有函都内置了一个arguments对象,arguments对象中存储了传递的所有实参。
(1)、arguments 是一个伪类数组对象,它也可以通过索引来操作数据,通过arguments.length可以获取实参的长度获取长度
伪数组并不是真正意义上的数组
具有数组的length属性
按照索引的顺序进行存储的
它没有真正数组的一些方法
(2)、在调用函数时,我们所传递的实参都会在arguments中保存
(3)、我们即使不定义形参,也可以通过grguments来使用实参,只不过比较麻烦
arguments[0]表示第一个实参
arguments[1]表示第二个实参
(4)、arguments有个属性叫callee,
这个属性对应一个函数对象,就是当前正在指向函数的对象
<script>
function fun() {
//这两种都是检查arguments是不是数组
//console.log(arguments instanceof Array);//false
//console.log(Array.isArray(arguments));//false
//console.log(arguments.length);//用来获取实参的长度
//console.log(arguments[0]);//hello
console.log(arguments.callee);//指向当前这个对象
}
fun("hello", true);
</script>
课堂小练习:1、利用函数求任意个数的最大值
function getMax() {
var max = arguments[0]
for (var i = 0; i < arguments.length; i++) {
if (max < arguments[i]) {
max = arguments[i]
}
return max
}
}
var num = getMax(1, 2, 3, 33, 111)
2、封装函数,输入一个年份,判断是否是闰年(闰年可以被4或者400整除)
面试题:
1.伪数组和真数组的区别是什么?
2.如何获取到伪数组?
3、函数方法call(),apply() ,bind()
-这两个方法都是函数对象的方法,需要通过函数对象来调用
-当对函数调用call()和apply()方法时,都会调用函数执行
-在调用call和apply()可以将一个对象指定为第一个参数, 此时这个对象将会成为函数执行的this
-call()方法可以将实参在对象之后一次传递
apply()方法需要将实参封装到一个数组中统一传递
<script>
var name = "我是window";
function fun(a) {
console.log("a=", a);
alert(this.name);
}
var obj = {
name: "我是obj1",
sayName: function () {
alert(this.name);
},
};
var obj2 = {
name: "我是obj2",
};
//obj.sayName(); //obj
//obj.sayName.call(obj2);//obj2
//fun.call(obj, 2);//obj1,2
//fun.apply(obj2, [2,3]);
//fun(1);
</script>
总结this的情况
1.以函数形式调用时,this永远是window
2.以方法的形式调用时,this是调用方法的对象
3.以构造函数的形式调用时,this是新创建的那个实例对象
4.使用call和apply调用时,this是指定的那个对象,如果不写第一个参数,默认是window
4、函数调用函数
每个函数都是独立的代码块,用于完成特殊任务,因此经常会用到函数相互调用的情况
一般情况下,一个函数只做一件事
<script>
function fn1(){
console.log(111);
fn2();
console.log('fn1');
}
function fn2(){
console.log(222);
console.log('fn2');
}
fn1()
</script>
课堂小练习:用户输入年份,告知当年2月份多少天
<script>
function getDays() {
var year = prompt("请输入年份");
if (isRunYear(year)) {
alert("闰年2月有29天");
} else {
alert("平年2月有28天");
}
}
getDays();
function isRunYear(year) {
var flag = false;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
flag = true;
}
return flag;
}
</script>
5、立即执行函数
语法结构:函数对象()
立即执行函数,函数定义完后,立即被调用,立即调用函数,往往只会执行一次
<script>
//第一种写法
(function(){
alert("我是一个匿名函数~~~");
}) ();//外面的()是把整个函数当作函数名,后面的()是调用函数的意思
//第二种写法
(function () {
alert('匿名函数执行方式二')
}() );
//匿名函数传参
(function(a,b){
console.log("a="+a);
console.log("b="+b);
})(123,456);//不仅可以调用,还可以传值
</script>
标签:function,console,函数,形参,JavaScript,详解,实参,log From: https://blog.csdn.net/2301_76428778/article/details/145147250