在 if 语句块中使用 let 定义尚未定义的变量的替代方法是啥?

Posted

技术标签:

【中文标题】在 if 语句块中使用 let 定义尚未定义的变量的替代方法是啥?【英文标题】: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需要以某种方式定义或脚本解析器将遇到错误并停止。 【参考方案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 那里偷了一个绿色勾号。我很钦佩,也很感激你们两个,所以我会让你们两个自己去打。

以上是关于在 if 语句块中使用 let 定义尚未定义的变量的替代方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

块级作用域

JS中的let变量

VBA中Let与Set的区别

JS中的let变量

es6摘抄自网络

let 和const