Why does this code throw ReferenceError: test is not defined?

Why does this code throw ReferenceError: test is not defined?

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

尝试 运行 这个简单的代码。它给出了错误:ReferenceError: test is not defined,尽管我定义了那个变量。为什么会这样?

在变量声明中,变量名包含一个zero-width non-joiner (ZWNJ)字符(在es之间),这是不可见的,因为它的宽度等于0。但是,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 a‌dd(a, b) {
  return a + b
}

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

函数名和函数调用中有一个ZWNJ字符,所以在这里起作用。但是,如果有人将该函数复制到他们的代码中,然后手动键入 console.log(add(3, 4)),它会抛出 ReferenceError: add is not defined.

以上内容请不要当真,纯属玩笑而非实际用途

相关

  • What characters are valid for JavaScript variable names?
  • No visible cause for “Unexpected token ILLEGAL”