函数
1.函数:
function,是被设计为执行特定任务的代码块
2.说明:
函数可以把具有相同或相似逻辑的代码“包裹”起来,通过函数调用执行这些被“包裹”的代码逻辑,这么做的优势是有利于精简代码方便复用。
一.函数的使用:
<script>
// 1.函数的声明
function sayHi() {
console.log('嗨')
}
// 2.函数调用
sayHi();
</script>
1.函数名命名规范:
①.和变量命名基本一致 ②.尽量小驼峰式命名法 ③.前缀应该为动词 ④.命名建议:常用动词约定
<script>
function userName() {
}
</script>
2.函数封装
函数的调用语法
<script>
// 函数调用,这些函数体内的代码逻辑会被执行
userName()
// !!声明(定义)的函数必须调用才会真正被执行,使用(调用函数)
// 例:
//函数一次声明可以多次使用,每一次函数调用函数体里面的代码会重新执行一次
userName()
userName()
// 类似于alert() , parseInt() 这种名字后面跟小括号的本质都是函数的调用
</script>
函数体是函数的构成部分,它负责将相同或相似代码“包裹”起来,直到函数调用时函数体内的代码才会被执行。函数的功能代码都要写在函数体当中。
二.函数传参:
1.传参的作用:
这样的函数只能求 10 + 20, 这个函数功能局限非常大
解决办法:把要计算的数字传到函数内
<script>
function sum(num1,num2) {
console.log(num1+num2)
}
sum(10,20)
</script>
2.有参数的函数声明和调用
声明;
调用:
3.形参和实参
<script>
// name1和name2是形参,是形式上的参数
function name(name1,name2) {
document.write(name1,name2)
}
name('谢霆锋','吴彦祖')
// 谢霆锋和吴彦祖是实参,实际参数
</script>
①形参:声明函数时写在函数名右边小括号里的叫形参(形式上的参数) ②实参:调用函数时写在函数名右边小括号里的叫实参(实际上的参数) ③形参可以理解为是在这个函数内声明的变量(比如 num1 = 10)④实参可以理解为是给这个变量赋值 ⑤开发中尽量保持形参和实参个数一致 ⑥我们曾经使用过的 alert('打印'), parseInt('11'), Number('11') 本质上都是函数调用的传参
4.函数封装求和
形参如果不被赋值,就是undefined
<script>
// 声明函数
function getSum(num1, num2) {
// num1 = 100
// num2 = undefined
console.log(num2);
document.write(num1 + num2);
// 100 + undefined
}
getSum(10);
</script>
三.函数的返回值:
函数是被设计为执行特定任务的代码块,执行玩特定任务后把结果给我们。 比如:
这个num 就是 函数getSum调用的返回值
let num = getSum();
<script>
function getMax() {
// 100 就是 函数在执行完毕的时候 会返回的数据
return 100;
}
let num1 = getMax(); // num1 =100
console.log(num1);
</script>
函数返会值的使用场景:
<script>
function getMax(n1,n2) {
if(n1>n2) {
// 返回n1
return n1
}else {
// 返回n2
return n2
}
}
// 可以在函数外选择输出方式
//getMax(10,20)
// 方式1
// let num1=getMax(10,20)
// console.log(num1);
// 方式2 简洁
console.log(getMax(10,20))
// getMax(4,8)
document.write(getMax(4,8))
// getMax(5,9)
alert(getMax(5,9))
</script>
小结:
1.不能同时执行多次return,第一个return生效 2.函数内部,写了return,下面的代码就不会执行了 3.如果函数没有写return,就相当于函数写了return undefind
四.作用域
通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。 !
全局变量演示
<script>
// 直接写在全局作用域下的变量 = 全局变量 在任意的地方来访问
let num = 100; // 全局变量 在任何地方都可以访问
function getMax() {
console.log('函数 访问全局变量', num);
}
getMax();
for (let index = 0; index < 2; index++) {
console.log('for循环内 块级作用域 访问全局变量', num);
}
if(true){
console.log("if语句 也 可以访问全局变量",num);
}
</script>
局部变量演示:
<script>
// 局部变量
// 如果是在函数内部定义的变量 就叫做局部变量a
// 局部变量 不能在 它的大括号之外使用的,否则就会报错!!
let msg = 10000; // 全局变量
// 局部变量 函数内部 声明的变量
function getMax() {
// 声明一个数字
let num = 200; // 局部变量
}
// 局部变量 不能在 超出它的大括号来使用
console.log(num); // 会报错
</script>
块级变量
<script>
// 块级变量 就是我们在块级作用域内 定义的变量
// 块级变量 类似局部变量,也是超出了自身的大括号 不能使用
for (let index = 0; index < 2; index++) {
// num 块级变量
let num = 100;
}
console.log(num);// 使用块级变量 出错!!
</script>
变量的使用情况
<script>
let num = 100;
function getMax() {
// let num =200;
console.log(num); // 200 就近原则 寻找变量的时候 优先找自己的作用域 自己没有再往外找
}
getMax();
</script>
作用域链:是代码寻找变量的一种机制,或者规定(就近原则)
1.先找自己的作用域(没有的话) 2.再往外部(父级)的作用域来找(没有的话) 3.继续往外部(父级)来找 4.直到找到全局作用域
五、函数嵌套
<script>
function func1() {
console.log('func1');
func2();
}
function func2() {
console.log('func2');
func3();
}
function func3() {
console.log('func3');
}
func1(); //输出 func1
</script>
六、匿名函数 (后期会详细讲)
函数可以分为: 1.具名函数 声明:function fn() {} ==>(有名字) 调用:fn() 2.匿名函数 function() {} ==>(没名字)
函数表达式 letfun2=function(){}
自执行函数 作用:防变量污染 特点:在定义函数的同事也执行函数 代码:(匿名函数){}
补充:提醒自己直接套
<script>
// 1.声明数组arr
let arr=[1,2,3,4,]
// 3.接收到函数arr的值
function numMax(arr) {
}
// 2.接受到数组arr,然后传给,函数
// 可以省略第一步,直接在[]写1,2,3,4即可
numMax([arr])
</script>