var test = 1
console.log(test)

尝试运行这个简单的代码。它给出了错误:ReferenceError: test is not defined
,尽管我定义了该变量。为什么会这样?
答案 0 :(得分:22)
在变量声明中,变量名称包含zero-width non-joiner (ZWNJ)字符(在e
和s
之间),这是不可见的,因为它的宽度等于零。但是,ECMAScript规范允许将此字符作为变量名称的一部分。
但是,在console.log()
来电中,只有test
,没有任何特殊字符。因此,它会抛出引用错误,因为变量名称为te<ZWNJ>st
,而不是test
。
幸运的是,有一种简单的方法可以检查变量名是否包含这些字符。您可以将代码粘贴到JS Bin或JS Fiddle中 - 它们在红色背景上用白点表示这些字符。这就是JS Fiddle的样子:
我认为某些IDE中也有类似的功能。
旁注:这是一种有趣的方法,可以防止人们将您在答案中使用的代码段复制粘贴到自己的代码中。请考虑以下代码段:
// Warning: non-copy-pastable, it won't work if you copy it into your code.
function add(a, b) {
return a + b
}
console.log(add(2, 3))
&#13;
在函数名和函数调用中有一个ZWNJ字符,所以它在这里工作。但是,如果有人将该函数复制到其代码中,然后手动键入console.log(add(3, 4))
,则会抛出ReferenceError: add is not defined
。
请不要认真对待上述内容,这相当于一个笑话而非实际用途。