javascript - 为什么这段代码会抛出 ReferenceError : test is not defined?

标签 javascript unicode language-design language-features referenceerror

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

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

最佳答案

在变量声明中,变量名包含一个zero-width non-joiner (ZWNJ)字符(介于 es 之间),这是不可见的,因为它的宽度等于零。但是,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 .

请不要把上面的当回事,这与其说是一个实际用途不如说是个玩笑。

相关

关于javascript - 为什么这段代码会抛出 ReferenceError : test is not defined?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37364404/

相关文章:

javascript - 具有基于参数的动态字段的 GraphQL ObjectType

javascript - 改变 JSON 对象的 React 状态 将数组存储为值

python - Cython 将字符串转换为 unicode

java - 数组的最大大小 - 类型不匹配 : cannot convert from long to int

java - 为什么Java中的java.lang.Thread类没有被设计者标记为final?

javascript - HTTP 请求直到 header 有附件

javascript - 是什么让输入容易受到 XSS 攻击?

string - 测试字符串中的日文/中文字符

C++ unicode(或 wstring?)等同于 (char)

java - 为什么浮点原始类型在除以和乘以 10 的某些倍数时以科学记数法显示?