我刚开始用“Eloquent JavaScript”这本书学习JavaScript,可以在eloquentjavascript.net免费访问.到目前为止,我非常喜欢这本书,只有一部分我不明白.这是关于表达和陈述的:
http://eloquentjavascript.net/chapter2.html#p65af5913
我知道之前在*上已经提到了这个主题,但是,这些是更具体的问题而且我 – 坦率地说 – 没有得到整个事情.
在段落的开头,作者解释了什么是表达式:如果我理解正确,原子值如42或“23”被认为是表达式.如果将这些值应用于运算符(如42-19中),则也将其视为表达式. (我猜因为它显然是23,这又是一个原子值.)我用以下方式解释:每个值 – 无论是直接输入还是尚未计算 – 都被称为表达式.那是对的吗?
然后作者说:“存在一个比表达式大的单元.它被称为语句.[…]大多数语句以分号(;)结尾.最简单的语句是带有在它之后用分号.“他举了一个例子
!false;
作为一个例子陈述.我的问题是“这是什么使这个声明?最后只是分号?”当我使用JavaScript控制台时,无论是否使用分号输入都没有区别.它总是返回true.然而,作者说“如果以某种方式改变了世界,”[A]陈述只会成为某种东西.“所以给定的例子甚至不是一个陈述,因为它“只产生[s]值[…]为真,然后立即将[s]扔进比特桶”?我现在真的很困惑……如果我没有把它弄得一团糟,那么声明必须有一些“副作用”(就像一个变量的声明),对吧?
但是,如果有人能解释一下声明是什么,我会很高兴.如果有人可以给出一个例子,其中这些术语的区别实际上是有用的,那也是非常有帮助的,因为现在我甚至无法想象为什么作者甚至不愿意介绍这些词汇.非常感谢你提前!
解决方法:
一个简单的,虽然含糊不清的类比,将是一种自然语言的文本,由分为句子的短语组成.像“下雨”这样的短语可以自己形成一个句子,比如“我不会出去.正在下雨.”或者是一个更大句子的一部分,比如“恶劣的天气,它一直在下雨.”
也就是说,表达式和语句之间的区别在javascript中非常模糊.与其他类似C语言不同,您不仅可以在语句中使用表达式,还可以在表达式中使用语句:
a = 1 + function(x) { if(x > 1) return 10 } (20)
一些现代的javascript程序,比如Jquery,使用基本上使它们成为单个表达式的声明技术.
这种模糊的区别(不仅仅是混淆)来自这样一个事实:Javascript是一种类似C / pascal / algol的命令式语言,同时受到像Lisp这样的函数式语言的严重影响,它们没有“声明”.在函数式语言中,一切都是表达式.
为了使事情更有趣,语句之间的分号(有时)是可选的,因此没有简单的方法来判断两个表达式是属于一个语句还是形成两个不同的语句.考虑:
a = 1 // two
!2 // statements
a = 1 // one
+2 // statement