当前位置: 首页 > news >正文

JavaScript中的函数基础知识

JavaScript中的函数基础知识

  • 1.函数声明的三种方式
    • 1.1 函数声明语句
    • 1.2 函数表达式
    • 1.3 new Function
  • 2.函数的返回值
  • 3.函数调用的几种方法
  • 4.函数参数
    • 4.1 函数内部的arguments对象(是个伪数组)
    • 4.2 获取形参的个数
    • 4.3 函数不存在重载
    • 4.4 参数传递
      • (1) 基本数据类型传递(值传递)
      • (2) 引用数据类型传递(引用传递)
      • (3) 总结
  • 5.函数属性

1.函数声明的三种方式

1.1 函数声明语句

function fn(x,y,z){
  ...
}

1.2 函数表达式

 let sum1 =function(){}//匿名函数
 let sum2 =()=>{} //箭头函数
 let sum3=function sumFn(){}//有名称sumFn,sumFn只能在函数内部用

1.3 new Function

最后一个参数是我们要执行的函数体,语法如下:
let funcName= new Function("arg1","arg2","arg3","arg4","arg5",......,"函数体")

let sum=new Function("a","b","return a+b")

2.函数的返回值

return后不跟值或者没有return,则默认该函数的返回值为undefined

3.函数调用的几种方法

  • 函数调用方法
  • 对象的方法调用方式(打点方式)
  • 构造函数调用方式
  • 间接调用方式
    call、apply、call等方法

以上几种调用方法相信大家都清楚。不太了解的参见https://blog.csdn.net/fageaaa/article/details/145694249

4.函数参数

4.1 函数内部的arguments对象(是个伪数组)

function add(x,y){
    console.log(arguments[2])//3
}
add(1,2,3);

4.2 获取形参的个数

function add(x,y){
   ...
}
console.log(add.length)//2

4.3 函数不存在重载

ps:java中是存在重载的。我们可以举一个例子:

function add(x, y) {
  console.log(x + y);
}
function add(x, y, z) {
  console.log(x + y + z);
}
//在javascript中这里答应NaN,而不是3。因为在javascript中不存在重载,一旦两个函数名相同
//后一个函数就会覆盖前一个函数,所以z=undefined,相加是非数字类型
add(1, 2); //NaN
add(1, 2, 3); //6

重载:定义相同的函数名,传入的不同参数;

4.4 参数传递

(1) 基本数据类型传递(值传递)

被传递的值会被复制到另外一个局部变量。

function addTen(num) {
  num += 10;
  return num;
}
let count = 20;
let result = addTen(count);
alert(count); // 20, 没有变化
alert(result); // 30

(2) 引用数据类型传递(引用传递)

示例1:

function setName(obj) {
  obj.name = 'Nicholas';
  obj = new Object();
  obj.name = 'Greg';
}

let person = new Object();
setName(person);
//obj的值指向了person
//obj.name = 'Nicholas',所以person的值name被改为了Nicholas,
//之后obj = new Object(),它自己又开辟了一个新地址
//所以obj.name = 'Greg'该的是obj新地址内name的值而不是person的name值
alert(person.name); // Nicholas

示例2:

function fn(obj = { name: "沙和尚" }) {
    console.log(obj);
    obj.name = "唐僧";
    console.log(obj);
}
//调用fn,obj开辟一块新地址
fn(); //沙和尚 唐僧
//调用fn,obj依然开辟一块新地址
fn(); //沙和尚 唐僧

示例3:

let obj = { name: "沙和尚" };
function fn(a = obj) {
   console.log(a);
   obj.name = "唐僧";
   console.log(a);
}
//调用fn,将obj的地址传递给a(a指向obj)
fn(); //沙和尚 唐僧
//调用fn,将obj的地址传递给a(a指向obj)
//但这时候obj的name已经被改为了唐僧
fn(); //唐僧 唐僧

示例4:

//这个与3类似
let obj = { name: "沙和尚" };
function fn(a) {
    console.log(a);
    obj.name = "唐僧";
    console.log(a);
}
fn(obj); //沙和尚 唐僧
fn(obj); //唐僧 唐僧

(3) 总结

  • 值传递:
    将number, string, boolean, undefined, null, 和 symbol这些类型的变量作为参数传递给函数时,函数内部接收的是这些值的副本
  • 引用传递:
    将对象(Object)、数组(Array)和函数(Function)等复合类型的变量作为参数传递给函数时,函数内部接收的这些对象在内存中的地址的副本,而不是对象的实际内容。因此,对参数所做的任何修改都会影响原始对象。

5.函数属性

function fn(a, b) {
     //形参的个数
     console.log(arguments.length); //3
     //实参的个数
     console.log(fn.length); //2
     console.log(fn.name); //fn
}
fn(1, 2, 3);
console.dir(fn);

打印的fn结果如下:
在这里插入图片描述

相关文章:

  • win10本地部署deepseek-r1步骤
  • 用户的声音 | 文档结构化信息提取方案测评:LLM、开源模型部署与云端API,谁是合适选择?
  • 在 Vue 项目中,为什么要在列表组件中写 key,其作用是什么?
  • 什么是幂等性?
  • 【SpringMVC】Controller的多种方式接收请求参数
  • DeepSeek模型快速部署教程-搭建自己的DeepSeek
  • 在Unity中用简单工厂模式模拟原神中的元素反应
  • DeepSeek服务器繁忙 多种方式继续优雅的使用它
  • MySQL 的存储引擎有哪些?它们之间有什么区别? MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别? MySQL 的索引类型有哪些?
  • 框架篇 - Hearth ArcGIS 框架扩展(DryIoC、Options、Nlog...)
  • XCP协议
  • 【刷题】leetcode
  • var、let、const区别
  • 项目中分库分表的分布式ID如何生成
  • 数据结构与算法-搜索-bfs(floodfill and 最短路):池塘计数,城堡问题,山峰和山谷,迷宫问题,武士分度的牛,抓住那头牛
  • 深入理解 QObject的作用
  • 【JavaEE进阶】#{}和${}
  • 【Pandas】pandas Series reindex_like
  • Casbin 权限管理介绍及在 Go 语言中的使用入门
  • 【AI工具之Deepseek+Kimi一键免费生成PPT】
  • 泽连斯基称与特朗普通话讨论停火事宜
  • “救护车”转运病人半路加价,从宝鸡到西安往返都要多收钱
  • 对话|蓬皮杜策展人布莱昂:抽象风景中的中国审美
  • 宁合两大都市圈交汇之城含山:要想身体好,常往含山跑
  • 加拿大总理访美与特朗普“礼貌交火”
  • “穿越看洪武”,明太祖及其皇后像台北故宫博物院南园展出