在 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 我怎么可能不知道这个特定的功能是否已经定义(let
、const
或 var
)?
因为我正在对用户生成的脚本进行后处理,该脚本可能包含也可能不包含该函数定义,并且需要:
如果尚未定义,则提供回退;或 如果是,什么也不做【问题讨论】:
三元运算符呢?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 定义尚未定义的变量的替代方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章