fnTest = /xyz/.test(function () {
xyz;
}) ? /\bparent\b/ : /.*/;
我无法理解这个javascript代码片段是如何工作的。 有人可以解释一下这个代码片段的逻辑吗?
答案 0 :(得分:5)
浏览器并不总是对函数使用相同的toString()
实现。有些浏览器会将函数中的代码作为字符串返回,其他浏览器则不会。
此表达式的第一部分确定浏览器是否在toString()
中使用函数的代码,因为只有在/xyz/.test(function () { xyz; })
中找到字符串true
时,xyz
才会给出toString()
在该函数上调用/\bparent\b/
的结果。
表达式的其余部分是三元组,它将导致/.*/
或toString()
,因此整个表达式可以如下概括:“如果浏览器在{{1中使用函数的代码将fnTest
设置为正则表达式/\bparent\b/
,否则将fnTest
设置为/.*/
。
如果您要使用函数执行某些操作,则可以使用此函数,但是您知道只需要对包含名为parent
的变量的函数执行此操作。在支持的浏览器上,您可以使用fnTest.test(some_function)
查看some_function
是否包含parent
,因为toString()
实施fnTest.test(some_function)
将导致无法做出此决定的浏览器总是返回true,因为/.*/
将匹配所有字符串。