许多动态语言的变量是无需定义就可以直接使用的, 比如 Python, perl 等, 还有一些动态语言虽然可以先进行定义, 但是没有定义的变量还是可以直接使用, 比如 JavaScript, Basic 等等. 这些语言的赋值语句兼有定义变量的功能, 比如一个 x = 5, 可能是在改变一个已经存在的变量的值, 也可能是重新定义一个新的变量. 这样看起来是很方便, 实际上确是非常容易产生错误的. 并且它可能把一个在 C++, Java 这些语言中可以在编译期就检查出来的拼写错误变成一个逻辑错误! 注意是逻辑错误, 不是运行的时候出错, 你的程序还将正常运行, 只是里面的逻辑已经发生了变化, 运行的结果可能是正确的, 也可能在某些时候变得莫名其妙, 是属于最难找的那类错误!
第一种情况是对已有变量赋值时拼写错误了
hello = 10
heiio = hello + 1
return hello
这里的第二行本来是想把 hello 的值增加 1 的, 结果由于拼写错误, 变换成了一个新变量的定义, 程序照常运行, hello 的值没变... 如果区分了定义和赋值, 这里的赋值是一个未定义的变量, 程序不能正常运行, 这个错误很快就会被找出来, 会被直接定位到错误的地方. 而变成逻辑错误了之后, 除非你有非常完善的单元测试来测试你的逻辑, 否则这个错误将会很难找到.
还有一种情况是定义新变量时和已有变量重名了, 如果定义有自己的语法明确这是条定义, 这个重名也能立即被发现, 但是把定义和赋值混淆后会把它认为是一个赋值语句, 改变了之前变量的值, 引起逻辑上的混淆.