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

6.函数表达式 - JS

函数表达式

function (someArgs) { someStatements }
function name(someArgs) { someStatements }
(someArgs) => { someStatements }
  1. 函数表达式就是要,在一个表达式中定义一个函数;
  2. 箭头函数也是一个简洁的函数表达式;
  3. 执行完函数表达式,才能开始调用:
    • 一般是立刻调用、用作回调等;
    • 可以赋值给其他变量,使得后续可以继续使用,不能变量提升(先调用后声明)。
  4. 根据语法解构,函数表达式可以分为两类:
    • 箭头函数表达式;
    • 由关键字 function 引导的函数表达式。
g();	// 报错,函数还没有声明
f();	// 报错,函数还没有声明
let f = function g() { console.log('Hi'); }	// =后边的是一个具名函数表达式
f();	// 'Hi'
g();	// 报错,具名函数表达式的名字只能在函数体内部调用

具名函数表达式

具名函数表达式在语法上,多一个名字:

  1. 创建的函数 name 属性就是该名字,不会因为因为赋值而改变;
let g = function f(n) { }
let h = gg.name			// 'f'
h.name			// 'f'(function(){}).name	// '',空字符串,没有名字
let k = function () {}
k.name			// 'k'
  1. 具名函数表达式的名字只能在函数体内部调用,递归的场景可以使用;
let factorial = function fac (n) {if (n <= 1) return 1;else return n * fac(n - 1);	// 不要使用 factorial(n - 1)
}factorial(4)	// 24
fac(4)			// 报错
  1. 注意:不要在函数表达式的函数体内,使用其赋值的变量,这样容易出错。
let factorial = function fac (n) {if (n <= 1) return 1;else return n * factorial(n - 1);
}factorial(4)	// 24let f = factorial;
factorial = 1;
f(4)			// 报错

箭头函数表达式

箭头函数表达式的语法更加简洁,含义上有一些差异,用法上也有一些限制:

  • 箭头函数没有独立的 this
  • 没有 arguments 对象;
  • 不能用作构造函数(使用 new 调用会 报错,无法访问 new.target 关键字);
  • 函数体内不能使用 yield,不能用以创建生成器。

基本语法

  1. 只有一个参数时,() 可以省略;
  2. 函数体只有单个语句,{} 可以省略,返回值就是该语句/表达式的值。
  3. 函数体有多个语句,必须使用 {} 包围。
/* 函数体只有一个语句 */
() => 单个语句
单个参数 => 单个语句
(单个参数) => 单个语句
(参数1, 参数2) => 单个语句
let f = ()=>console.log(111)
f() === undefined		// true/* 函数体有多个语句,使用{} */
() => { 多个语句 }
单个参数 => { 多个语句 }
(单个参数) => { 多个语句 }
(参数1, 参数2) => { 多个语句 }
let g = ()=>{}

注意事项

  1. 语法上,一个对象作为表达式返回时,加 ()
let f = ()=>{ a:1 }			// 不报错,a被当成一个标签,执行了表达式 “1”,返回 undefined
let f = ()=>{ a: 1, b: 2 }	// 报错
let f = ()=>{ a: 1; b: 2 }	// 不报错,a,b都时标签
let f = ()=>( {a:1, b:2} )	// 不报错,()改变了优先级
  1. 注意 this 的指向。更多因此导致的注意事项,见此
http://www.lryc.cn/news/294235.html

相关文章:

  • 【RK3288 Android10 C30 支持sim卡拔掉不弹窗,及热插拔】
  • python生成docx文件
  • 网络异常案例四_IP异常
  • Hack The Box-Challenges-Misc-M0rsarchive
  • 验证码倒计时:用户界面的小细节,大智慧
  • Web后端:CSRF攻击及应对方法
  • 【手写数据库toadb】toadb表对象访问操作,存储管理抽象层软件架构设计思想应用
  • SpringBoot使用Rabbit详解含完整代码
  • 深度学习本科课程 实验3 网络优化
  • Eclipse 安装使用ABAPGit
  • std::mutex std::recursive_mutex std::shared_mutex
  • vscode的vetur文档格式化失效
  • idea 快捷键ctrl+shift+f失效的解决方案
  • C++面试:数据库的连接池管理
  • React Hook之钩子调用规则(不在循环、条件判断或者嵌套函数中调用)
  • 深入理解TCP网络协议(3)
  • JavaScript实现归并排序及vscode输出乱码解决
  • Redis面试题40
  • 2024年危险化学品经营单位安全管理人员证考试题库及危险化学品经营单位安全管理人员试题解析
  • Kafka相关内容复习
  • JVM之Java内存区域
  • 几个MySQL系统调优工具
  • Linux内核与驱动面试经典“小”问题集锦(2)
  • windws安装mysql详细步骤
  • Linux的库文件
  • JAVA Web 学习(五)Nginx、RPC、JWT
  • Python编程的十大神奇依赖库
  • Java类的继承
  • 【DC渗透系列】DC-4靶场
  • 开源软件全景解析:驱动技术创新与行业革新的力量