为什么这段代码会抛出ReferenceError: test未定义的错误?

6

var te‌st = 1
console.log(test)

尝试运行这段简单的代码,却出现了错误:ReferenceError: test is not defined,尽管我已经定义了那个变量。为什么会发生这种情况?
1个回答

26
在变量声明中,变量名包含一个零宽不连字符(ZWNJ)字符(在es之间),因为其宽度为零,所以是不可见的。然而,ECMAScript规范允许这个字符作为变量名的一部分。
然而,在console.log()调用中,只有test,没有任何特殊字符。因此,它抛出引用错误,因为变量名是te<ZWNJ>st,而不是test
幸运的是,有一种简单的方法来检查变量名是否包含这些字符。您可以将代码粘贴到JS Bin或JS Fiddle中,它们会用红底白点表示这些字符。在JS Fiddle中看起来就像这样:

我认为一些集成开发环境中也有类似的功能。
附注:这是一种防止人们将答案中使用的代码片段复制粘贴到自己的代码中的有趣方法。考虑以下代码片段:

// Warning: non-copy-pastable, it won't work if you copy it into your code.
function a‌dd(a, b) {
  return a + b
}

console.log(a‌dd(2, 3))

在函数名和函数调用中有一个零宽不连字符,所以它在这里起作用。但是,如果有人将该函数复制到他们的代码中,然后手动输入console.log(add(3, 4)),它会抛出ReferenceError: add is not defined
请不要认真对待上述内容,这更像是一个玩笑而不是实际用途。
相关:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接