函数
函数(Function)
- 函数也是一个对象
- 他具有其他对象所有功能
- 函数中可以储存代码,且可以在需要时调用代码
语法:
function 函数名(){
语句…
}
调用函数: - 调用函数就是执行函数中存储的代码
- 语法:
函数对象()
使用typeof检查函数对象会返回function
函数的定义方法:
- 函数声明
function 函数名(){
语句…
} - 函数表达式
const 变量 = function(){
语句…
}
cons - 箭头函数
() =>{
语句…
}
== const fn=() =>{}==
参数
形式参数
- 在定义函数时,可以在函数中指定数量不等的参数(形参)
- 在函数中定义参数,相当于在函数内部声明了对应的变量
实际参数
- 在调用函数时,可以在函数的()传递数量不等的实参
- 实参会赋值给其对于的形参
- 参数:
- 如果实参和形参数量相同,则对应的实参会赋值给对应的形参
- 如果实参多余形参,则多余的实参不会使用
- 如果形参多余实参,则多余的形参为undefined
参数类型
- 在js中不会检查参数的类型,可以传递任何类型的值作为参数
== 在定义参数时,可以为参数指定默认值,默认值会在没有对于实参时生效==
函数每次调用,都会重新创建默认值
- 函数声明
function 函数名([参数]){
语句…
} - 函数表达式
const 变量 = function([参数]){
语句…
} - 箭头函数
// 当箭头函数中只有一个参数时,可以省略()
([参数)=>{
语句…
}
修改变量时,只会影响当前的变量
修改对象时,如果有其他变量指向该对象则所有指向该对象的值都会受到影响
对象作为参数传递,传递实参时,传递的并不是变量本身,而是变量中储存的值
在函数中,通过return关键字来指定函数的返回值
返回值就是函数的执行结果,函数调用完毕后返回值便会作为结果返回
任何值都可以作为返回值使用(包括对象和函数之类)
如果return后不跟任何值,则相当于返回undefined
如果不写return,则函数返回值还是undefined
return—执行的地方 立刻结束
作用域
- 作用域是指一个变量的可见区域
- 作用域有两种
- 全局作用域
- 在网页运行时创建,在网页关闭时消耗
- 所有直接编写到script标签中的代码都位于全局作用域中
- 全局作用域中的变量是全局变量,可以在任意位置访问
- 局部作用域
- 块作用域是一种局部作用域
- 在代码块执行时创建,代码块执行完就销毁
- 在块作用域声明的变量是局部变量,只能在块内部访问,外部无法访问
- 函数作用域
- 函数作用域也是种局部作用域
- 函数作用域在函数调用时产生,调用结束时销毁
- 函数每次调用都会产生一个全新的作用域
- 在函数中定义的变量是局部变量,只能在函数内部访问,外部无法访问
作用域链
当我们使用一个变量时,js会在优先作用域中寻找变量
如果找到了则直接使用,如果没找到,则去上一层作用域中寻找,找到了则使用==(就近)==
如果没找到,则继续去上一层找,依次类推,如果一直没找到,则报错
window对象
var用来声明变量,作用和let一样,但是var不具有块作用域
- 在全局中使用var声明的变量,都会作为window对象的属性保存
- 使用function声明的函数,都会作为window的方法保存
- 使用let声明的变量,不会存在window中
- var虽然没有块作用域,但有函数作用域
- 在局部作用域,若不使用var和let声明,会自动成为window对象的属性,也是全局变量不要使用,一定要先声明
变量的提升
-
使用var声明的变量,他会在所有代码执行前被声明而不是赋值
所有我们可以在变量声明前就访问变量函数的提升
-使用函数声明创建的函数,会在其他代码执行前被创建 所以我们可以在函数声明前调用函数
let声明的变量实际也会提升,但在赋值前解释器禁止对该变量的访问
立即执行函数(IFEE)
在开发中应该尽量减少直接在全局作用域中编写代码
所以我们代码应该尽量写在编写作用域中
如果使用let声明的变量,可以使用{}来创建块作用域
是一个匿名函数,并且只会调用一次
可以利用IFEE来创建一个一次性的函数作用域,避免变量冲突的问题
(function () {
let a = 10
console.log(111)
}());//这里要手动加一个分号,不然系统会将两个识别出两个函数调用错误
(function () {
let b = 10
console.log(111)
}()))
this
箭头函数没有自己的this,它的this由外层作用域决定,箭头函数的this和它的调用方式无关
this所指向的对象会根据函数调用方式不同而不同
- 以函数形式调用时,this指向的是window
- 以方法形式调用时,this指向的是调用方法的对象
严格模式
- 在严格模式下,语法检查变得更严格
-
- 禁止一些语法 2. 更容易报错 3.提升了性能
- 在开发中应尽量使用严格模式
"use strict" // 全局的严格模式
function fn(){
"use strict" //函数的严格模式
}