当名称被参数覆盖时访问自身的函数

Function accessing itself when name is overwritten by argument

本文关键字:访问 函数 覆盖 参数      更新时间:2023-09-26

通常,函数可以这样访问自己:

(function f() {
    console.log(f); // Prints the function definition
}());

但是,当函数f有一个参数也称为f时,该参数优先:

(function f(f) {
    console.log(f); // Prints 1
}(1));

在第二个示例中,当其中一个参数与函数同名时,我如何访问该函数?

[另外,我在哪里可以找到说参数应该优先于函数名的文档?)

你没有。只要遵循这个简单的规则

不要对任何你想要使用的变量进行遮蔽(或在更特定的范围内重新声明)。

注意:arguments.callee将为此工作,但仅在某些实现中。它实际上正在被逐步淘汰,并且很可能在未来完全消失。

关于:

[另外,我在哪里可以找到说参数的文档应该优先于函数名吗?)

JavaScript具有词法/静态作用域。下面的代码包含两个标识符:

(function f(f) {
    console.log(f); // Prints 1
}(1));
  • 全局作用域中名为f的函数(可通过window.f访问)
  • 全局函数f的参数,其本身名为f。这个参数的作用域是函数,这是一个比外部作用域更具体的作用域。换句话说,参数的优先级不需要任何特殊规则;一个局部/内部/更特定的作用域总是遮蔽外部/不太特定的作用域。

可以使用参数。

( function f( f ) {
    console.log( f ); // Prints 1
    console.log( arguments.callee ); // Prints the function definition
}( 1 ) );