JavaScript函数的多种写法 您所在的位置:网站首页 声明函数的两种形式 JavaScript函数的多种写法

JavaScript函数的多种写法

2024-05-30 10:31| 来源: 网络整理| 查看: 265

原文链接:The Many Faces of Functions in JavaScript

作者:Leo Balter and Rick Waldron

译者:Liubara

本文已获得作者授权,转载请注明出处。

如果你曾与JavaScript代码打过交道,你应该会很熟悉如何定义和调用函数,但是你真的知道有多少种定义函数的方法吗?对于编写和维护测试Test262(浏览器JavaScript标准测试)来说,这是一个十分常见的挑战,尤其是当一个新特性出现且与现有的函数语法有关联,或者扩展了现有函数的API时。有必要确保新的或被提议的语法和API是有效的,且对语言中的每一个现有变体都是有效的。

本文内容是对JavaScript中已经存在的函数语法格式的概述说明。本文档不包括类声明和表达式,因为这些形式生成的对象不是“可调用的”,对于本文来说,我们只关注生成“可调用的”函数对象的格式。此外,这篇文章也不包括参数列表(包括默认参数、解构,或者尾逗号),因为这些话题足够再写一篇文章了。

译者注:类声明、默认参数、解构和尾逗号是ES6/7的新特性~~不妨碍看这篇文章哈

旧方法函数声明和表达式

大家都知道,最广泛应用也是最早的函数定义形式就是函数声明和函数表达式。前者是最初设计的一部分(1995)并出现在第一个版本的规范(1997年)中,后者是在第三个版本(1999年)引入的。我们可以从这些规范中提取三种不同的定义形式:

// 函数声明 function BindingIdentifier() {} // 命名函数表达式 // (BindingIdentifier对函数外部不可访问) (function BindingIdentifier() {}); // 匿名函数表达式 (function() {});

要注意的是匿名函数表达式可能仍然有一个“名称”,Mike Pennisi在这篇文章What's in a Function Name?中解释得很清楚。

Function构造器

当我们在讨论一种语言的“函数API”的时候,就已经开始讨论Function构造器。在考虑最初的语言设计时,函数声明的语法形式可以被解释为函数构造器的API的“文字”形式。Function构造器为定义函数提供了一种方法:通过N个字符串参数指定函数参数和函数主体,(如下面的例子)最后一个字符串参数始终是函数主体(需要指出的是,这是一种动态求值形式,会有潜在的安全风险)。对于大多数情况来说,这种形式并不适合,因此它的使用非常稀少——但是自从第一个版本的ECMAScript以来,它就一直存在在JavaScript中了。

new Function('x', 'y', 'return x * y;'); 新方法

自从ES2015推出以来,已经引入了几种新的语法形式。这些形式的变化是巨大的!

not-so-anonymous函数声明

这是一种新的匿名函数声明形式,如果你曾用过ES Modules,应该清楚这种语法。虽然它可能看起来与匿名函数表达式非常相似,但它实际上有一个默认名称,即“default”

// not-so-anonymous 函数声明 export default function() {}

顺便说一下,这个“名称”(指“default”)本身并不是有效的标识符,并且没有绑定在该匿名函数上。

方法定义

对于下面这个例子,大家应该能很快发现它定义了匿名和命名函数表达式作为属性的值。注意,这些不是不同的语法形式。它们是之前讨论过的函数表达式的示例,是在初始对象时编写的。这种形式最初是在ES3中引入的。

let object = { propertyName: function() {}, }; let object = { // (BindingIdentifier在这个函数中不可访问) propertyName: function BindingIdentifier() {}, };

在ES5中引入了访问器属性定义:

let object = { get propertyName() {}, set p


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有