max*_*son 6 javascript ecmascript-6 template-literals tagged-templates
我想创建一个可以正常调用的函数:
myFn(arg1, arg2)
Run Code Online (Sandbox Code Playgroud)
或者作为标记模板文字:
myFn`text ${someVar}`
Run Code Online (Sandbox Code Playgroud)
在 的实现中myFn,是否可以检测它是正常调用还是作为标记模板文字调用?传递给模板文字的参数具有特定的模式(第一个参数是字符串数组,附加参数(如果存在)将比第一个参数中数组的长度少一个),因此我可以根据该模式进行检测。但理论上有人可以将相同的参数模式传递给正常的函数调用。
除了参数模式检测之外,是否有任何特殊的方法来检测它的调用方式?
我认为没有任何方法可以绝对确定地进行检查,但是您可以在参数检查中添加一些内容,以减少使用满足您检查的参数意外调用它的可能性。如果作为模板标签调用,第一个参数将是一个至少包含一个元素的数组,它将被冻结,并且它将有一个名为的属性,raw该属性是一个相同长度的数组。正如您已经提到的,您还可以检查剩余参数的数量:
function myFn ( arg1, ...rest ) {
const isTag = !!(
arg1 && arg1.length > 0 && arg1.raw && arg1.raw.length === arg1.length &&
Object.isFrozen( arg1 ) &&
rest.length + 1 === arg1.length
);
console.log( isTag );
}
// isTag === true
myFn`test`;
myFn`${0} ${1}`;
myFn``;
// isTag === false
myFn( );
myFn( ['test'] );Run Code Online (Sandbox Code Playgroud)
您可以进一步验证数组和 in 中的元素是否raw都是字符串,甚至在用适当的字符替换原始字符串中的转义序列后检查它们是否是相同的字符串。我认为这可能是不必要的,因为它不会让某人故意欺骗你的函数变得更加困难(尽管这会限制他们可以用来欺骗它的输入),并且上述测试已经不太可能失败,除非有人试图故意欺骗它。
| 归档时间: |
|
| 查看次数: |
471 次 |
| 最近记录: |