定义函数
1.有名函数的定义也叫函数声明
function 函数名(【参数列表】){
函数体
【return [表达式;】】
}
2.匿名函数的定义有两种形式:函数表达式形式和事件注册形式
函数表达式形式
var fn=function([参数列表]){
函数体
[return [表达式;]]
}
事件注册形式
文档对象.事件=function(){
函数体;
}
调用函数
1.以函数形式调用
function fun(){
alert("你好!")
}
fun()
2.函数作为对象方法调用
let myObject={
name:'小明',
age:'18',
total:function(){
return this.name+'今年'+this.age+'岁';
}
}
myObject.total()
3.使用构造函数调用函数
//构造函数
function fun(a, b) {
this.num1 = a
this.num2 = b
}
let x = new fun(1, 2)
console.log(x.num1);//1
4.使用apply()和call()方法调用
函数作用域
函数作用域和全局作用域
块级作用域
let const
作用域
作用域就是代码的执行环境,全局执行环境就是全局作用域;函数的执行环境就是私有作用域,它们都是栈内存
闭包
闭包是指有权访问另一个函数作用域的变量的函数,创建闭包的常见方式,就是在一个函数内部创建另一个函数 作用 1.可以获得函数的局部变量
// 获得函数fn的局部变量user
function fn(){
var user='andy'
return function(){
return user
}
}
2.可以实现函数内的局部变量的累加
function fn(){
var num=20
return function(){
num++
return num
}
}
var b=fn//获得函数
console.log(b())//调用匿名函数
console.log(b())//第二次调用匿名函数,实现累加
缺点
1.闭包会使得函数中的变量都被保存到内存中,滥用闭包很容易造成内存消耗过大,导致网页性能问题。解决方法是在退出函数之前,将不再使用的局部变量全部删除。
2.闭包可以使函数内部的值可以在函数外部进行修改。所以,若把父函数当做对象使用,把闭包当做它的公用方法,把内部变量当做它的私有属性,不能随便改变父函数内部变量的值。
arguments对象
arguments是一个对应于传递给函数的参数的类数组(array-like)对象。 arguments对象是所有(非箭头)函数都可用的局部变量。可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处。
使用 1.获取参数的长度 2.根据索引值获取某一个参数 3.callee获取当前arguments所在的函数
function fun(a, b, c) {
// 类数组对象(本质是一个对象):arguments
console.log(arguments);
// [Arguments] { '0': 10, '1': 20, '2': 30, '3': 40, '4': 50 } 5
// 1.获取参数的长度
console.log(arguments.length)
// 2.根据所以值获取某一个参数
console.log(arguments[2])//30
console.log(arguments[4])//50
// 3.callee获取当前arguments所在的函数
console.log(arguments.callee)
//arguments.callee()
}
fun(10, 20, 30, 40, 50)
函数参数
函数的参数分为形参和实参
形参:在声明一个函数的时候,为了函数的功能更加灵活,有些值是固定不了的,对于这些不能固定的值,可以给函数设置参数。这个参数没有具体的值,仅仅起到一个占位置的作用,通常称之为形式参数,也叫形参。
实参:如果函数在声明时,设置了形参,那么在函数调用的时候就需要传入对应的参数,把传入的参数叫做实际参数,也叫实参。
//函数内部是一个封闭的环境,可以通过参数的方式,把外部的值传递给函数内部
// 带参数的函数声明
function 函数名(形参1,形参2,形参3……){
//函数体
}
函数名(实参1,实参2,实参3);
形参1=实参1
形参2=实参2
形参3=实参3
……
箭头函数
语法:(参数)=>函数体
// 传统函数
let sum=function(a,b){
return a+b
}
// 箭头函数
let sum=(a,b)=>{
return a+b
}
用法: 1.省略包含参数的小括号 如果只有一个参数,可以不用括号。没有参数或多个参数的情况,才使用括号:
//单个参数,都可以
let nu1=(x)=>{
return x
}
let num2=x=>{
return x
}
// 没有参数需要使用括号
let num3=()=>{
return 1
}
// 有多个参数需要括号
let num4=(a,b)=>{
return a+b
}
2.省略包含函数体的大括号
2.1 使用大括号箭头后面就只能有一行代码
2.2 省略大括号会隐式返回这行代码
2.3 省略大括号不能用return
// 有效
let num1=(a,b)=>{
return a+b
}
// 有效
let num2=(a,b)=>a+b //相当于 return a+b
// 无效写法
let num3=(a,b)=>return a+b
3.嵌入函数
箭头函数简洁的语法适合嵌入函数的场景
let arr = [1, 5, 3]
arr.map(val => val * 2)//[2,10,6]
// console.log(arr.map(val => val * 2));
箭头函数不能使用arguments
预定义函数
1.eval():计算字符串中的表达式返回表达式的值
2.escape():字符串(除了字母和数字)进行编码转换
3.unescape():字符串(除了字母和数字)进行编码转换的转换回去 ,与escape()互逆
4.isNaN():判断变量是否是NaN
5.ifFine():判断变量是否有限
6.parseFloat():转换为浮点数
7.parseInt():转换为整数