为啥这段代码会抛出 ReferenceError: test is not defined?

Posted

技术标签:

【中文标题】为啥这段代码会抛出 ReferenceError: test is not defined?【英文标题】:Why does this code throw ReferenceError: test is not defined?为什么这段代码会抛出 ReferenceError: test is not defined? 【发布时间】:2016-09-18 18:21:08 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

// 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”

【讨论】:

以上是关于为啥这段代码会抛出 ReferenceError: test is not defined?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这段代码会抛出 java.lang.***Error [重复]

为啥这个不安全的代码会抛出 NullReferenceException?

为啥 typeof 有时只抛出 ReferenceError?

如果在声明变量之前使用了变量,为啥不会抛出 ReferenceError?

为啥有时会抛出 FileNotFoundException

为啥完成Activity会抛出NPE?