函数
函数概念: 把一段可以重复执行的代码封装起来
函数的作用:减少冗余代码
函数的声明(定义): 语法:
function 函数名(){
函数体
}
函数的调用:函数名()
函数名的命名规则:
1. 大小字母,下划线,美元符号,数字都可以用
2. 数字不能开头
3. 不能用关键字和保留字
4. 变量名建议用名词定义,函数名建议用动词定义
5. 函数名尽量不用下划线拼接多个单词,而是用小驼峰命名法
预解析:
js中存在预解析-特征是所谓的变量声明,函数声明提升,将声明过程提升到了当前作用域最前面
// 第1题
console.log(num);
var num = 100;
undefined
// 第2题
fn();
function fn() {
console.log(123);
}
123
// 这里无法调用,因为目前这里的fn1是undefined
//fn1(); // 类型错误 fn1 is not a function
// 函数表达式-赋值式函数
var fn1 = function () {
console.log("Naruto!");
};
// 这里可以执行
fn1()
预解析总结:
1. 匿名函数赋值给变量的定义方式,预解析时遵循变量的预解析规则,不会将函数代码预解析
2. 预解析的时候,会将定义提前放在内存中,不会提前将赋值放在内存中
3. 如果变量名和函数名同名了,保留函数预解析,忽略变量预解析
因为函数预解析其实包含了赋值的过程,函数定义放在内存中的时候将函数的代码也放在内存中
变量的预解析只有空间,没有值,所以如果是先预解析变量,那后面的函数预解析赋值就将空间中放入了值,
如果是先预解析的函数,再次预解析变量的时候,空间已经存在了,再次定义空间也是没有意义的。
4. 省略var定义的变量是不会有预解析的
5. js代码如果报错了,那后面的代码就不会执行了
6. 不会执行的代码中有变量或函数定义也会预解析,因为预解析在执行之前。
匿名函数:
当将一个函数赋值给一个变量的时候,这个函数的名字就没有用了,所以我们可以将这个函数名称省略:
语法:
var f = function(){
console.log(12)
}
调用:f()
匿名函数 小括号包裹,后面加小括号调用。
语法2:
(function(a,b){
var c = a + b;
document.write(c);
})(1,2);
自执行函数:
可以在自执行函数前面加 分号 ; 感叹号!波浪线 ~ 也可以用小括号()把函数包裹起来
语法:
;(function(){
var str=''
console.log('自执行函数2');
})()
局部变量:在js中,在ES6以前,只有在函数中声明的变量才是局部变量;
全局变量:其他场景中声明的变量都是全局变量
函数的参数
函数为什么要有参数?
进一步提升函数的可复用性
函数参数分为两个部分 实参 和 形参
1. 函数声明过程中 传递参数--形(式)参(数)
function 函数名(形参1,形参2...){函数体}
2. 函数调用过程中 传递参数--实(际)参(数)
函数名(实参1,实参2...)
形参与实参个数不一样的情况:
实参个数小于形参个数,那么没有赋值的形参 值是undefined
实参个数大于形参个数,那么多余的实参没有形参接收 不影响
形参与全局变量同名,在我们的函数内部,到底是在使用全局变量还是在使用形参?
在函数内部可以使用全局变量
但是如果全局变量和函数内部局部变量同名,我们优先使用函数内部的局部变量
知识拓展:
arguments 可以获取到实参的值,形成一个伪数组;
console.log(arguments) 由实参组成的伪数组对象;
函数返回值:
1. 在函数中可以使用return关键字,让函数存在返回值
return ;
2. 直接用函数调用代码 给变量赋值,那么在该变量中就接收了函数的返回值(函数的执行结果)
var res = 函数名(); console.log(res);
3. 如果函数本身没有return,我们又使用变量去接收函数返回值,会得到undefined
4. return后面的代码不会执行,相当于提前结束函数
5. 有return,但是return后面没有值,那么返回值还是undefined
6. return和值要写在同一行
7.return会终止代码继续运行
8. 函数运行后返回一个结果,只能返回一个
封装函数:判断一个数是不是水仙花数 有参数,有返回值
function isNarcissisticNumber(num) {
if (num < 100 || num > 999) {
console.log("请输入正确的三位数");
return ;
}
var a = parseInt(num / 100);
var b = parseInt((num / 10) % 10);
var c = num % 10;
if(a**3+b**3+c**3===num){
return num+'是水仙花数'
}else{
return num+'不是水仙花数'
}
}
var result=isNarcissisticNumber(153);
console.log(result);
用函数判断一个数字是否是素数 有参数,有返回值
function getNumberType(num) {
var flage = true;
for (var i = 2; i < num / 2; i++) {
if (num % i === 0) {
flage = false;
break;
}
}
if (flage) {
console.log(num + "是素数");
} else {
console.log(num + "是合数");
}
}
var result = getNumberType(15);
//分别获取4位数的 千位 百位 十位 个位
var a = parseInt(num / 1000);
var b = parseInt(num / 100 % 10);
var c = parseInt((num / 10) % 10);
var d = num % 10;