JS函数(二)
(一)return关键字
- 关键字return一般结合函数一起使用。而且需要注意,这个关键字一般只能在函数体中使用
- 作用:
1.函数体中如果遇见关键字return,函数体后面语句不再执行
2.函数体中关键字可以将计算完结果返回【函数体外部可以获取函数返回结果】
//第一个作用
function fun(){
console.log('水面清圆');
console.log('一一风荷举');
return;
console.log('疏影横斜');
}
fun();
//第二个作用
function bigStar(){
//声明一个局部变量
var str = '野渡无人舟自横';
//将函数体中数据【计算完结果】返回给函数体外面,函数体外可以获取函数返回结果
return str;
}
var result = bigStar();
console.log(result);
//封装一个函数:函数两个功能是计算两个数之和
function add(num1,num2){
return num1 + num2;
}
var result = add(13,45);
console.log(result);
(二)练习
- 概述:函数(function),主要的作用是将某个功能进行封装,我们可以重复利用函数功能
- 函数使用:分为声明和调用
习题1——水仙花数
//封装一个函数:判断某数是否为水仙花数,若是,则返回真,否则返回假
function isNarcissus(num){
//获取当前数字个、十、百
var ge = num % 10,shi = parseInt(num / 10 % 10),bai = parseInt(num / 100);
//获取当前数字个、十、百的立方
var result = Math.pow(ge,3)+Math.pow(shi,3)+Math.pow(bai,3);
//判断是不是水仙花数字
if(result == num){
return true;
}else{
return false;
}
}
var bo1 = isNarcissus(567);
var bo2 = isNarcissus(153);
console.log(bo1);
console.log(bo2);
/*
函数结合循环语句使用
在控制台中打印出三位数字当中的水仙花数
*/
for(var n = 100;n < 1000;n++){
if(isNarcissus(n)){
console.log(n+'是水仙花数');
}
}
习题2——完美数
- 设计一个函数:判断某数是否为完美数字,若是则返回true,否则返回false
- 完美数字:
比如:数字6的约数1、2、3之和等于这个数字本身即为完美数字
function isWanMei(num){
//累加器
var sum = 0;
//先找到num变量存储的这个数字的约数有哪些
for(var i = 1;i < num;i++){
if(num % i == 0){
sum += i;
}
}
//经过循环语句遍历以后可以计算出当前数字num的约数之和
//判断当前数字是否是完美数
if(num == sum){
return true;
}else{
return false;
}
}
//调用函数
console.log(isWanMei(45));
//判断1-1000之间的完美数字有哪些
for(var k =1;k <= 1000;k++){
if(isWanMei(k)){
console.log(k+'是完美数');
}
}
(三)表达式形式函数
- 概述:在JS当中函数有两种形式:
第一种:关键字function定义的函数
第二种:表达式形式函数,就是将关键字function定义的函数赋值给变量形式 - 表达式形式的函数中,可以省略关键字形式函数的名字【匿名函数】
//表达式形式函数 声明
var poem = function (){
console.log('水面清圆');
}
//表达式形式函数 调用
poem();
poem();
(四)关键字形式函数与表达式形式函数的区别
- 概述:两者功能都是一样的(都是可以将某一个功能进行封装,当你想用这个功能的时候,调用即可)
- 但是,它们两者在使用的时候语法有一些注意事项
- 表达式形式的函数:只能在声明后才能调用
- 表达式形式的函数:由于变量声明部分提升(提升到当前作用域最上方),因此是undefined
//表达式形式函数
//声明
//fun() 注意:此处为错误写法
var fun = function (){
console.log('我是表达式形式的函数');
}
fun();
- 关键字函数可以在声明之前、声明之后调用
- 由于解析器可以将关键字形式函数的声明部分提升到当前作用域的最上方
isOdd(657);//奇数
//声明部分
function isOdd(num){
if(num % 2 != 0){
alert('奇数');
}else{
alert('偶数');
}
//调用
isOdd(4);
isOdd(43);
}
(五)回调函数
CallBack回调函数
- 概述:当一个函数执行的时候,传递的实参是另外一个函数声明部分。这个实参(函数)即为回调函数
//声明函数
function promise(a,b,callback){
callback();//在函数体内调用回调函数
callback();
callback();
}
//下面函数出现回调函数
promise(1,'水面清圆',function(){
console.log('我是函数形式的实参,我被执行了');
});
(六)函数递归
- 概述:在很多编程语言中,都有函数直接或间接调用自身这种现象【递归】
//函数的使用分为两部分:声明和调用
function add(){
//函数体中可以书写任意语句
console.log('水面清圆');
//函数调用自身
add();//死循环
}
//调用函数
add();
(七)IIFE
(1)概述
【immediately invoing function express】
- 概述:IIFE在声明表达式形式函数的同时,立刻马上执行一次
//表达式形式函数 声明部分
var fun = function (){
console.log('我被执行了');
}();
//只有表达式形式函数声明部分后才能紧随(),立刻执行一次
function sun(){
console.log('我是关键字形式函数,声明部分之后不能紧随()');
}() //注意:此为错误写法
(2)IIFE其他写法
- 关键字形式函数后面不能紧随小括号立即执行。但是程序员可以通过一些手段【加、减、非、小括号】,
将关键字形式函数变为表达式形式函数,立即执行一次(IIFE)
+function (){
console.log('+号可以将关键字形式函数变为表达式形式函数');
}();
-function (){
console.log('-号可以将关键字形式函数变为表达式形式函数');
}();
!function (){
console.log('!号可以将关键字形式函数变为表达式形式函数');
}();
(function (){
console.log('()号(包含整个声明部分)可以将关键字形式函数变为表达式形式函数');
})();
(3)IIFE的作用域
- 每一个IIFE都有属于自己的独立的作用域,彼此互不影响
//第一个IIFE
+function(a){
a += 99;
console.log(a);
}(100);
//第二个IIFE
+function(a){
a += 3;
console.log(a);
}(44);