【问题标题】:What's the alternative to defining an as-yet-undefined variable with let inside an if-statement block?在 if 语句块中使用 let 定义尚未定义的变量的替代方法是什么?
【发布时间】:2020-04-25 01:25:48
【问题描述】:

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

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.');

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


NB 我怎么可能不知道这个特定的功能是否已经定义(letconstvar)?

因为我正在对用户生成的脚本进行后处理,该脚本可能包含也可能不包含该函数定义,并且需要:

  • 如果尚未定义,则提供回退;或
  • 如果是,什么也不做

【问题讨论】:

  • 三元运算符呢? let fun = typeof fun !== 'undefined' ? fun : () => console.log('fun() not defined');
  • 在同一个脚本中不能有两个以let fun 开头的语句。请注意,用户可能已经声明了fun。这是一个陷阱,以防他们没有。
  • @Rounin 啊,你是对的,我不知道我在想什么。我建议的形式的三元运算符根本不起作用>.
  • 别担心,@Sebastian。我经历了完全相同的思考过程,尝试了完全相同的事情并获得了完全相同的顿悟。
  • 我正在对用户编写的脚本进行后期处理。他们可以明确声明:我的回调名称为 myCustomCallbackz,但他们没有义务这样做。如果他们省略了这样一个明确的声明,他们的回调将被假定为myCallback。如果他们不确认他们的回调具有自定义名称并且他们也没有定义myCallback,那么myCallback需要以某种方式定义或脚本解析器将遇到错误并停止。

标签: javascript function ecmascript-6 variable-assignment


【解决方案1】:

我想说你使用var 的方法是你最好的选择在这种非常非常具体的情况下

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

myFunction();

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

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

var 是我认为的答案。

【讨论】:

  • 感谢您的确认,@T.J.Crowder。这些天我几乎从不使用var。在上面发现var有一个无法模仿的功能时,我不知道是沮丧还是高兴。
  • @Rounin - 哈哈。从这个想法中振作起来,模块将使最后剩下的用例变得非常罕见...... :-)
【解决方案2】:

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

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

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

  …
  __the_callback();
}

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

【讨论】:

  • 优秀。确实做得很好。你刚刚从@T.J.Crowder 那里偷了一个绿色勾号。我很钦佩,也很感激你们两个,所以我会让你们两个自己去打。
猜你喜欢
  • 2013-09-17
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 2023-03-19
  • 2020-08-31
  • 2021-05-03
相关资源
最近更新 更多