为什么这段代码抛出ReferenceError:test没有定义?

时间:2016-05-21 14:49:46

标签: javascript unicode language-design language-features referenceerror



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




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

1 个答案:

答案 0 :(得分:22)

在变量声明中,变量名称包含zero-width non-joiner (ZWNJ)字符(在es之间),这是不可见的,因为它的宽度等于零。但是,ECMAScript规范允许将此字符作为变量名称的一部分。

但是,在console.log()来电中,只有test,没有任何特殊字符。因此,它会抛出引用错误,因为变量名称为te<ZWNJ>st,而不是test

幸运的是,有一种简单的方法可以检查变量名是否包含这些字符。您可以将代码粘贴到JS Bin或JS Fiddle中 - 它们在红色背景上用白点表示这些字符。这就是JS Fiddle的样子:

我认为某些IDE中也有类似的功能。

旁注:这是一种有趣的方法,可以防止人们将您在答案中使用的代码段复制粘贴到自己的代码中。请考虑以下代码段:

&#13;
&#13;
// 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))
&#13;
&#13;
&#13;

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

请不要认真对待上述内容,这相当于一个笑话而非实际用途。

相关