函数

一、什么是函数?
函数是一段JavaScript代码,它只定义一次,但可能被执行或调用任意次。


二、函数的参数化
形参、实参、this、函数返回值


三、函数的定义
函数声明语法:
这种方法声明的函数有变量提升

function add(num1, num2) {
  return num1 + num2;
}

函数表达式:

let sub = function (num1, num2) {
  return num1 - num2;
};

箭头函数:

let mul = (mun1, num2) => {
  return num1 * num2;
};
//当函数内语句只有一句且是return开头时 可以省略{}
let mul = (mun1, num2) => num1 * num2;
//当函数有且只有一个形参时 可以省略()
let f2 = x => x ** 2;

箭头函数可以作为立即执行函数来使用:

//4为传入的参数
let xx = ((x) => x ** x)(4);

Function构造函数
最后一个参数始终会被当成函数体,而之前的参数都是新函数的参数。

  let sum = new Function(
    "num1",
    "num2",
    "let result=num1+num2; return result;"
  );

四、函数的参数

特征:js不关注参数的类型和数量 。
原因:js将传入的参数保存在arguments对象(类数组)中 ,但函数并不关心这个对象中有什么参数。
arguments对象:
1.arguments.length属性可以访问传入的具名参数的个数。

function test(a,b,c){
     console.log(arguments);
}
test(1,2,3,4,5) 
test.length
//5

function test(a,b,...c){
     console.log(arguments);
}
test(1,2,...[3,4,5]) 
test.length
//2

参数默认值:

function f2(name = "User", age = 0) {
  console.log(name, age);
}
f2();
//User
f2("Tom");
//Tom

扩展参数:
使用扩展运算符… 传入实参

function test(a,b,c){
     console.log(arguments);
}
let aa=[“tom”,”jack”,”rose”,”li”]
test(...aa)
//[“tom”,”jack”,”rose”,”li”]

剩余参数
使用扩展运算符… 传入形参 (可以理解为截取实参的一部分)

  function sum2(name, ...scores) {
    let r = scores.reduce((x, y) => x + y,
    0);
    console.log(`${name}总分为:${r}。`);
  }
  sum2("Tom", 80, 90, 100);

函数参数的常见问题:

  • 箭头函数不支持arguments对象。
  • 箭头函数支持剩余参数 。
  • arguments对象包含了剩余参数值。剩余参数没有接收到实参值时,为空数组。
  • 剩余参数必须位于参数列表的末尾。

五、函数调用
1.作为函数调用

function add(a,b){
      return a+b;
}
add(1,2)

说明:
1.如果return语句没有值,则返回undefined。
2.非严格的ES5中,函数调用上下文(this的值)是全局对象。然而,在严格模式下,调用上下文则是undefined。

2.作为构造函数调用

  function Car(name) {
    this.name = name;
    return null;
  }
  let car1=new Car(as)

说明:
1.构造函数通常不使用return关键字,当构造函数的函数体执行完毕时,它会显式返回该对象。
2.这种调用方式下,this指向当前新创建的对象。

3.作为方法调用

  let calculator = {
    oper1: 10,
    oper2: 20,
    add: function () {
      this.result = this.oper1 + this.oper2;
    },
  };
  calculator.add();

说明:
1.一般情况下,与普通函数的使用方式一致
2.方法是属于某个特定对象才能调用的函数。
3.这种调用方式下,this指调用该函数的对象。
4.关键字this没有作用域的限制,嵌套的函数不会从调用它的函数中继承this。

var obj = {
        x: 10,
        fn: function () {
            console.log(this)    //windows
            console.log(this.x)   //undefined
        }
var f = obj.fn
f()     

4.间接调用
使用函数对象的call( )和apply( )方法可以间接调用函数。
用法:第一个参数指定调用上下文(函数内部的this),第二个参数给函数传递参数。

let obj1 = {
  x: 100,
  y: 200,
  concat: function () {
    let r = [this.x, this.y];
    for (let a of arguments) r.push(a);
    return r;
  },
};
let obj2 = { x: 111, y: 222 };
let r3 = obj1.concat.call(obj2, 11, 22, 33);
let r4 = obj1.concat.apply(obj2, [2, 3, 4, 5]);
//r3=
//

对比 Apply()会将参数默认进行扩展运算符运算


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值