一.函数
function,是被设计为执行特定任务的代码块
函数可以把具有相同或相似逻辑的代码“包裹”起来,通过函数调用执行这些被“包裹”的代码逻辑,这么做的优势是有利于精简代码方便复用。
- 可以多次调用
- 可以在任意时刻掉用(当然前提是已经声明好了)
- 语法
语法:
function 函数名(){
代码块
}
调用函数语法:
函数名()
扩展:
1.函数声明的时机,是在js刚进入执行环境的时候(函数声明会提前)
2.函数名命名规范
- 和变量命名基本一致 _ $ 数字不能开头
- 尽量小驼峰式命名法
- 前缀应该为动词 常用 get 获取某个值 set 设置某个值
-
命名建议:常用动词约定
3.封装步骤:
- 分析有没有相同代码
- 抽取相同代码,并给一个名字
- 使用这个名字 == 执行这段代码
4.函数的复用代码和循环重复代码有什么不同?
循环代码写完即执行,不能很方便控制执行位置
随时调用,随时执行,可重复调用
二.函数传参
1.有参数的函数的声明调用语法:
声明: function 函数名(形参,...,形参)
-
调用: 函数名(实参,实参,...)
2.形参和实参
形参:声明函数时写在函数名右边小括号里的叫形参(形式上的参数) 相当于声明变量
实参:调用函数时写在函数名右边小括号里的叫实参(实际上的参数) 相当于变量赋值
形参可以理解为是在这个函数内声明的变量(let num;)实参可以理解为是给这个变量赋值(比如 num1 = 10)
变量声明了,但没赋值 默认值为 undefined( 形参如果不被赋值,就是undefined)
开发中尽量保持形参和实参个数一致
我们曾经使用过的 alert('打印'), parseInt('11'), Number('11') 本质上都是函数调用的传参
3.函数返回值
语法:
return 数据在函数体中使用 return 关键字能将内部的执行结果交给函数外部使用
函数内部只能运行到 1 次 return,并且 return 后面代码不会再被执行,所以 return 后面的数据不要换行写
return会立即结束当前函数
函数可以没有 return,这种情况函数默认返回值为 undefi
三.作用域
1.作用域概述:
通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。
2.作用域分为:
- 全局作用域:作用于所有代码执行的环境(整个 script 标签内部)或者多个 js 文件
- 局部作用域:作用于函数内的代码环境,就是局部作用域。 因为跟函数有关系,所以也称为函数作用域
-块级作用域:块作用域由 { } 包括,if语句和for语句里面的{ }等
<script>
// 1.全局作用域: script顶层范围
// 全局变量
// 访问范围:定义后的任何位置
// 运行位置在变量之后才能访问 (不是书写位置)
let top = 1
function x(){
//2. 局部作用域(函数作用域)
// 局部变量
// 只能在当前函数内部使用
let num = 2
if(x){
// 3. 块级作用域
// 块级变量
// 只能在块作用域里访问
let sum = 3
}
}
</script>
3.在JavaScript中,根据作用域的不同,变量可以分为
全局变量:全局变量在变量定义之后区域可以访问和修改
局部变量:局部变量只能在当前函数内部访问和修改
块级变量:let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问
4.作用域的特殊情况for循环,声明初始值的变量,也是块级变量
函数形参,是一个局部变量
在块级或局部,未声明变量,直接赋值变量,相对于创建了一个全局变量
for (let i = 0; 1 < 4; 1++) {
document.write(i)
}
console.log(i)
// 2.函数形参,是一个局部变量
function fun(num){
}
// 3. 在块级或局部,未声明变量,直接赋值变量,相对于创建了一个全局变量
if(ture){
foo = 2
}
console.log(foo)
作用域链:
- 只要是代码,就至少有一个作用域
- 写在函数内部的局部作用域
- 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
-
根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链
6.匿名函数
6.1将匿名函数赋值给一个变量,并且通过变量名称进行调用 我们将这个称为函数表达式
语法:
6.2立即执行函数
作用:避免全局变量之间的污染
语法:
- 无需调用,立即执行,其实本质已经调用了
- 多个立即执行函数之间用分号隔开