除了在 if 语句块中使用 let 定义一个尚未定义的变量之外,还有什么替代方法?

What's the alternative to defining an as-yet-undefined variable with let inside an if-statement block?

在调用具有特定名称的函数之前,我想立即声明它(使用后备定义),如果它不存在:

if (typeof myFunction === 'undefined') {
  
  let myFunction = () => console.log('Warning: myFunction() has not been defined.');
}

myFunction();

但是,当然let 具有块范围,因此尽管在 if statement 中给 myFunction() 一个回退定义,myFunction() 在 if 语句块之外保持未定义。


最简单的解决方案是使用 var(没有块作用域)而不是 let:

var myFunction = () => console.log('Warning: myFunction() has not been defined.');

这是推荐的方法吗?还是我遗漏了一些更传统的东西?


N.B. 我怎么不知道这个特定的函数是否已经定义(或者用 letconstvar)?

因为我正在 post- 处理一个用户生成的脚本,它可能包含也可能不包含该函数定义并且需要:

我会说你使用 var 的方法是你最好的选择 在这种非常非常特殊的情况下:

if (typeof myFunction === 'undefined') {
  
  var myFunction = () => console.log('Warning: myFunction() has not been defined.');
}

myFunction();

同样,这是一个非常特殊的情况,可能是 var 剩下的极少数有效用例之一(可能 只有 一个)。当您不知道它是否已经定义或如何定义时,没有可靠的方法可以使用 let(或 const 等)在范围内声明绑定(松散地,变量)。

唯一的其他半可行解决方案是只分配给它,但这将特定于全局范围,并且在严格模式下会失败。

var就是我认为的答案。

使用typeof检查变量是否已经定义,不关心未声明的变量。

然后,不要试图用自定义名称声明变量,只需用您自己选择的名称声明一个 new 变量,它将保存现有函数或回退函数,然后使用自己的变量调用函数:

{
  const __the_callback = typeof myFunction == "function"
    ? myFunction
    : function fallback() { console.log("warning …"); };

  …
  __the_callback();
}

只需确保 __the_callback 不会与用户选择的名称冲突。