JS 函数
关键字形式的函数
<script type="text/javascript">
//关键字形式的函数
//声明部分
function fun(){
//书写封装功能性的代码
console.log("我是一枚大帅哥");
console.log("虽然不是真的");
}
//调用部分
fun();
//函数在js当中属于引用类型数据
console.log(typeof fun);//没有function类型,只有object类型
//函数如果不调用,函数体的代码不执行
console.log(1);
function func(){
var a = 100;
var b = 200;
console.log(a+b);
}
console.log(2);
func();
console.log(3);
//1,2,300,3
</script>
函数的形参与实参
<script type="text/javascript">
//声明一个关键字形式的函数
function add(a,b){//a,b是形参,不需要用var声明
console.log(a,b);
}
//调用
add("小明","小红");//小明,小红是实参
add();//undefined undefined
add(1);//1 undefined
add(false,[]);//false []
add(1,2,3);//1 2
//形参的个数不能决定实参的个数
//实参的个数也不能决定形参的个数
</script>
局部变量和全局变量
<script type="text/javascript">
//局部变量:函数形参、函数体内声明的变量都是局部变量
//局部变量只能在函数体内使用
function even(num){
var flag;
if(num % 2 == 0){
flag =num + "是偶数";
}else{
flag = num + "不是偶数";
}
console.log(flag)
}
even(65);
even(66);
</script>
<script type="text/javascript">
//全局变量:除了函数形参、函数体中声明的局部变量以外,都是全局变量
//全局变量可以在js行为层中任意地方使用
for (var m=0;m<2;m++) {
console.log(m);//0,1
}
console.log("循环体外部"+m);//循环体外部2
if(true){
var k = 9999;
console.log(k);//9999
}
console.log(k);//9999
function fun(){
console.log(m);//2
console.log(k);//9999
}
fun();
</script>
作用域
<script type="text/javascript">
//全局作用域:书写js代码,范围最大的两个script标签之间
//函数拥有作用域:函数的作用域范围是在函数体内,在全局作用之内
//全局变量:
var count = 666;
function fun(){
console.log(count);
}
fun();
</script>
练习(经典)
<script type="text/javascript">
//第一题
// var num=66;
// function fun(){
// var num = 99;
// console.log(num);//99
// }
// fun();
//第二题
var num=66;
function fun(){
//只把声明部分提升到作用域最开始部分
//在JS中任何语句都阻挡不了变量声明部分提升,会提升到当前作用域最上方
//相当于var num;
console.log(num);//undefined
var num = 99;
}
fun();
//第三题
var num=66;
function fun(){
//只把声明部分提升到作用域最开始部分
//在JS中任何语句都阻挡不了变量声明部分提升,会提升到当前作用域最上方
//相当于var num;
console.log(num);//undefined
if(false){
var num = 99;
}
}
fun();
</script>
关键字return
<script type="text/javascript">
//return 一般在函数体中使用
//函数体中return 后面的语句不再执行
function fun(){
console.log("我是大哥");
console.log("我是二哥");
return;
console.log("我是三哥");
}
fun();
for (var m =0;m<3;m++) {
console.log(12);
}
</script>
<script type="text/javascript">
//第二个作用:可以把函数体中计算的结果返回
function bigStar(){
var str = "二哈可以咬人";
return str;//将函数体中计算完的结果返回给函数体外面,函数体外面可以获取返回结果
}
var result = bigStar();
console.log(result);
</script>
<script type="text/javascript">
function add(num,num1){
return num+ num1;
}
var result = add(66,1234);//1300
result = add(1);//NaN
console.log(result);
</script>
函数练习
<script type="text/javascript">
//封装一个函数,判断数字是不是水仙花数字
function isNarcissus(num){
var ge = num%10;
var shi = parseInt(num%100/10);
var bai = parseInt(num/100);
if (num==Math.pow(ge,3)+Math.pow(shi,3)+Math.pow(bai,3)){
return true;
}
return false;
}
for (var m = 100;m<1000;m++) {
var result = isNarcissus(m);
if(result){
console.log(m);
}
}
</script>
<script type="text/javascript">
//设计一个函数,判断这个数字是不是完美数字
//如6:数字的约数(不包含本身)之和等于这个数字本身,即为完美数字
function isPerfectNum(num){
var sum = 0;
for (var m = 1;m<num;m++) {
if (num%m==0){
sum += m;
}
}
if(sum == num){
return true;
}
return false;
}
for (var i = 1; i < 1001; i++) {
var result = isPerfectNum(i);
if(result){
console.log(i);
}
}
</script>
表达式形式的函数
<script type="text/javascript">
//表达式形式的函数
//声明
var a = function (){
console.log("打大所多");
}
//调用
a();
</script>
关键字形式的函数与表达式形式的函数的区别
<script type="text/javascript">
//表达式形式的函数
console.log(fun);//undefined
var fun = function(){
console.log("表达式形式的函数");
}
fun();
// 表达式形式得函数只能在声明之后调用
//表达式形式函数:由于变量声明部分提升(提升到当前作用域最上方),所以是undefined
//关键字形式函数
console.log(isOdd);
isOdd(9);
// js解析器在解析代码的时候,除了可以将变量声明部分提升到当前作用域的最上方,也可以
// 将关键字形式的函数提升到当前作用域的最上方
function isOdd(num){
if(num%2!=0){
alert(num+"是奇数");
}else{
alert(num+"是偶数");
}
}
isOdd(6);
isOdd(7);
</script>
回调函数
<script type="text/javascript">
//声明函数
function promiss(a,b,callback){
console.log(a);
console.log(b);
console.log(callback);
callback();
}
//调用
promiss(1,"默默默默",function(){
console.log("已执行");
});
//回调函数
//当某一个函数执行的时候,传递的实参是另一个函数的声明部分,这个实参的函数即为回调函数
</script>
递归函数
<script type="text/javascript">
//函数使用分为声明和调用
function add(){
//函数体中可以写任意语句
console.log("哈哈蛤");
//函数自己调用自己
add();
}
//调用
add();
</script>
IIFE
<script type="text/javascript">
//IIFE immediately invoking function express
// 在声明表达式函数的时候,立刻执行一次
//表达式函数的声明部分
var fun = function(){
console.log("我执行了");
}();
//+,-,!,()可以将关键字函数变为表达式形式函数,立即执行一次
+function(){
console.log("立即调用+");
}();
-function(){
console.log("立即调用-");
}();
!function(){
console.log("立即调用!");
}();
(function(){
console.log("立即调用()");
})();
//错误写法,关键字形式函数不能这么调用
// function sum(){
// console.log("我执行了2");
// }();
</script>
<script type="text/javascript">
//每个IIFE都有自己的作用域,彼此不影响
+function(num){
num += 1;
console.log(num);//100
}(99);
+function(num){
console.log(num);//66
}(66);
</script>