“参数”是否应该出现在标识符的保留字列表中?

use*_*907 2 javascript typescript

保留关键字列表不包括“参数”。他们应该吗?我不明白如何将“参数”用作标识符。

T.J*_*der 6

有几个类似关键字的东西(甚至是实际的关键字)在 JavaScript(以及 TypeScript)中不是保留字;详细信息请参见此处arguments不是关键字,它是传统函数(使用关键字的函数)function和方法(在类或对象文本中使用方法语法声明的)中隐式声明的绑定(如变量)。这意味着您可以隐藏它,在尚不存在它的上下文中声明它,等等。

我不明白如何将“参数”用作标识符。

可以,但仅限于松散模式。这里有些例子:

// Arguments isn't implicitly declared outside traditional
// functions and methods
const arguments = 1;
console.log(arguments);     // 1
try {
    arguments = 1.5;
} catch (e) {
    console.log(e.message); // "Assignment to constant variable." (or similar)
}

const fn = () => {
    // Arrow functions don't have an `arguments` identifier declared for them
    let arguments = 2;
    console.log(arguments); // 2
};

fn();

function fn2() {
    if (true) {
        // Shadows the function-wide `arguments` only within this block
        let arguments = 3;
        console.log(arguments); // 3
    }
    // This uses the implicit `arguments` for the function
    console.log(arguments.length); // 0
}

fn2();
Run Code Online (Sandbox Code Playgroud)

arguments这在严格模式下无效,在严格模式下( 和)的使用受到限制eval。从上面的链接:

名称argumentseval不是关键字,但它们在严格模式代码中受到一些限制。参见12.1.1、12.1.3、14.1.2、14.4.1、14.5.1和14.7.1

这些不同的链接部分放在一起基本上意味着arguments( 和eval) 不能用作标识符。

其他非保留字的关键字或类似关键字的内容:

  • let并且const只是标识符之前的关键字。
  • asyncfunction仅是方法声明之前或之前的关键字。否则,它是一个可接受的标识符。
  • await只是async函数中的一个关键字。它在严格模式下是保留字,但在松散模式下则不然,其他几个模式也是如此。
  • yield只是生成器函数中的一个关键字。在严格模式下也保留。
  • NaNundefinedInfinity和其他是全局对象的只读属性,而不是关键字。
  • importexport仅仅是模块中的关键字。

我确信该列表不完整。:-)

这是一种不断发展、扩展的语言的本质,它保持着近 100% 的向后兼容性。