
2025-01-31 日报 Day83

今日的鸡汤
顺境时学会清空自己,逆境时学会提醒自己,向内清醒,向外谦逊,美好才会与你不期而遇。
今日学习内容
1、JS 红皮书 P287-289 第十章:函数
今日笔记
1、函数实际上是对象,每个函数都是Function类型的实例,而 Function 也有属性和方法,跟其他引用类型一样。因为函数是对象,所以函数名就是指向函数对象的指针,而且不一定与函数本身紧密绑定。函数通常以函数声明的方式定义,比如:
1 | function sum (num1, num2) { |
另一种定义函数的语法是函数表达式。函数表达式与函数声明几乎是等价的:
1 | let sum = function(num1, num2) { |
还有一种定义函数的方式与函数表达式很像,叫作“箭头函数”(arrow function),如下所示:
1 | let sum = (num1, num2) => { |
最后一种定义函数的方式是使用 Function 构造函数。这个构造函数接收任意多个字符串参数,最后一个参数始终会被当成函数体,而之前的参数都是新函数的参数。来看下面的例子:
1 | let sum = new Function("num1", "num2", "return num1 + num2"); // 不推荐 |
2、箭头函数: ECMAScript 6 新增了使用胖箭头(=>)语法定义函数表达式的能力。
1 | let arrowSum = (a, b) => { |
箭头函数简洁的语法非常适合嵌入函数的场景:
1 | let ints = [1, 2, 3]; |
如果只有一个参数,那也可以不用括号。只有没有参数,或者多个参数的情况下,才需要使用括号:
1 | // 以下两种写法都有效 |
箭头函数也可以不用大括号,但这样会改变函数的行为。使用大括号就说明包含“函数体”,可以在一个函数中包含多条语句,跟常规的函数一样。如果不使用大括号,那么箭头后面就只能有一行代码,比如一个赋值操作,或者一个表达式。而且,省略大括号会隐式返回这行代码的值:
1 | // 以下两种写法都有效,而且返回相应的值 |
箭头函数虽然语法简洁,但也有很多场合不适用。箭头函数不能使用 arguments、super 和new.target,也不能用作构造函数。此外,箭头函数也没有 prototype 属性。
3、函数名: 因为函数名就是指向函数的指针,所以它们跟其他包含对象指针的变量具有相同的行为。这意味着一个函数可以有多个名称,如下所示:
1 | function sum(num1, num2) { |
以上代码定义了一个名为 sum()的函数,用于求两个数之和。然后又声明了一个变量 anotherSum,并将它的值设置为等于 sum。注意,使用不带括号的函数名会访问函数指针,而不会执行函数。此时,anotherSum 和 sum 都指向同一个函数。调用 anotherSum()也可以返回结果。把 sum 设置为 null之后,就切断了它与函数之间的关联。而 anotherSum()还是可以照常调用,没有问题。
ECMAScript 6 的所有函数对象都会暴露一个只读的 name 属性,其中包含关于函数的信息。多数情况下,这个属性中保存的就是一个函数标识符,或者说是一个字符串化的变量名。即使函数没有名称,也会如实显示成空字符串。如果它是使用 Function 构造函数创建的,则会标识成”anonymous”:
1 | function foo() {} |
如果函数是一个获取函数、设置函数,或者使用 bind()实例化,那么标识符前面会加上一个前缀:
1 | function foo() {} |