一、函数
为什么需要函数?
函数可以把具有相同或相似逻辑的代码“包裹”起来,通过函数调用执行这些被“包裹”的代码逻辑,这么做的优势是有利于精简代码方便复用。函数是什么?
function执行特定任务的代码块函数使用:
// 使用function定义一个函数
function 函数名称(){
函数体
}
1.函数名称的命名规则和规范
规则:和变量命名规则一样:可以包含数字,字符,_ ,$,不能以数字开头
规范:小驼峰,一般以动词开头,代表这个函数的功能
2.函数的调用:函数名()
a. 函数声明的时机,是在 js 刚进入执行环境的时候 (函数声明会提前) (声明时机不是运行到这一行了才声明,不像我们的 let 变量一样)
b.函数可以多次调用,可以在任何时刻调用
3.函数体:
函数体是函数的构成部分,它负责将相同或相似代码“包裹”起来,直到函数调用时函数体内的代码才会被执行。函数的功能代码都要写在函数体当中。
- 函数传参
形参:声明函数时写在函数名右边小括号里的叫形参(形式上的参数)
实参:调用函数时写在函数名右边小括号里的叫实参(实际上的参数)
开发中尽量保持形参和实参个数一致
//带参的函数:模型
// 形参
function getSum(num1,num2){
// 实际执行效果,相当于声明了变量
// 变量声明,但没赋值:默认值为undefined
// let num1
// let num2
}
// 实参
// 相当于赋值操作
// num1 = 20
// num5 = 50
getSum(20,50)
- 函数返回值
有返回值函数的概念:当调用某个函数,这个函数会返回一个结果出来;这就是有返回值的函数
当函数需要返回数据出去时,用return关键字
返回值注意事项:
1.在函数体中使用 return 关键字能将内部的执行结果交给函数外部使用
2.函数内部只能运行到 1 次 return,并且 return 后面代码不会再被执行,所以 return 后面的数据不要换行写
3.return会立即结束当前函数
4.函数可以没有 return,这种情况函数默认返回值为 undefined
- 作用域
全局作用域:作用于所有代码执行的环境(整个 script 标签内部)或者多个 js 文件;
局部作用域:作用于函数内的代码环境,就是局部作用域。 因为跟函数有关系,所以也称为函数作用域;
块级作用域:块作用域由 { } 包括,if语句和for语句里面的{ }等
变量的作用域,在JavaScript中,根据作用域的不同,变量可以分为
全局变量:函数外部let 的变量;全局变量在变量定义之后区域可以访问和修改;
局部变量:函数内部let的变量;局部变量只能在当前函数内部访问和修改;
块级变量:{} 内部的let变量;let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问;
变量作用域特殊情况:
1.如果函数内部或者块级作用域内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐
2.函数内部的形参可以看做是局部变量,所以形参相当于函数内部定义的局部变量,只有在函数内部可以使用。
变量访问原则-作用域链:
1.只要是代码,就至少有一个作用域
2.写在函数内部的局部作用域
3.如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
4.根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链
作用域链:采取就近原则的方式来查找变量最终的值
- 匿名函数
函数分为两种:
具名函数:声明:function fn() {} -------调用:fn()
匿名函数:function() {}
1.匿名函数语法:将匿名函数赋值给一个变量,并且通过变量名称进行调用 我们将这个称为函数表达式
// 将函数做为一个变量进行定义,它不会全局的,也就没有全局污染
// 匿名不能单独的存在,它一般
// 1.做为变量的值--函数表达式
// 2.做为参数传递--回调函数
let fn = function() {
console.log('fn')
}
fn()
其中函数的形参和实参使用跟具名函数一致
注意:两个匿名函数之间,要加上 ;
(function () {
console.log(123)
})();
(function () {
console.log(234)
}());
2.立即执行函数
// 方式一
// ()把里面的代码当做一个表达式【返回一个值】
(function () {
console.log(11);
})();
// 方式二
// 把里面的代码当做一个表达式
(function () {
console.log(11);
}());