Javascript学习笔记(函数)

77 阅读4分钟

定义函数

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()方法调用

函数作用域

函数作用域和全局作用域

image.png 块级作用域 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():转换为整数