语句语法
语句语法
语句
表达式=变量+运算符
表达式=函数+变量
表达式=各种声明与定义
这样的原则JavaScript也成立
括号表示代码块
代码块表示一系列应该按顺序执行的语句,这些语句被封装在左括号({)和右括号(})之间。
每行结尾的分号可有可无
C 语言要求每行代码以分号(;)结束才符合语法。
JavaScript 则允许开发者自行决定是否以分号结束一行代码。如果没有分号,JavaScript 就把折行代码的结尾看做该语句的结尾(与 Visual Basic 和 VBScript 相似),前提是这样没有破坏代码的语义。
最好的代码编写习惯是总加入分号,因为没有分号,有些浏览器就不能正确运行。
逗号运算符
用逗号运算符可以在一条语句中执行多个运算。
var iNum1 = 1, iNum = 2, iNum3 = 3;
逗号运算符常用变量声明中。
注释
有两种类型的注释:
- 单行注释以双斜杠开头(//)
- 多行注释以单斜杠和星号开头(/),以星号和单斜杠结尾(/)
//this is a single-line comment
/*this is a multi-
line comment*/
符号区分大小写
与 Java 一样,变量、函数名、运算符以及其他一切东西都是区分大小写的。
比如:变量 test 与变量 TEST 是不同的。
变量是弱类型的
顺序语句
JavaScript是解释型语言。
程序的执行顺序和C语言一样从上到下执行。因此,在某些语句中,如果有错误,程序会执行到错误上方,(C语言会编译错误而不执行),而自错误以下的语句不执行。
但是对于函数来说,解释顺序并不是一句一句进行的。而是在解释之前会对JavaScript进行一次“预编译”,在预编译的过程中,会把定义式的函数优先执行,也会把所有var
变量创建,默认值为undefined
,以提高程序的执行效率。
预编译相关
当JavaScript引擎解析脚本时,它会在预编译期对所有声明的变量和函数进行如下处理:
- 在执行前会进行类似“预编译”的操作:首先会创建一个当前执行环境下的活动对象,并将那些用
var
申明的变量设置为活动对象的属性,但是此时这些变量的赋值都是undefined
,并将那些以function定义的函数也添加为活动对象的属性,而且它们的值正是函数的定义。 - 在解释执行阶段,遇到变量需要解析时,会首先从当前执行环境的活动对象中查找,如果没有找到而且该执行环境的拥有者有prototype属性时则会从prototype链中查找,否则将会按照作用域链查找。遇到
var a = ...
这样的语句时会给相应的变量进行赋值(注意:变量的赋值是在解释执行阶段完成的,如果在这之前使用变量,它的值会是undefined) 所以,就会出现当JavaScript解释器执行下面脚本时不会报错:
alert(a); // 返回值undefined //alert()浏览器发出通知
var a =1;
alert(a); // 返回值1
由于变量声明是在预编译期被处理的,所以在执行期间对于所有代码来说,都是可见的。但是,你也会看到,执行上面代码,提示的值是undefined,而不是1。这是因为,变量初始化过程发生在执行期,而不是预编译期。在执行期,JavaScript解释器是按着代码先后顺序进行解析的,如果在前面代码行中没有为变量赋值,则JavaScript解释器会使用默认值undefined。由于在第二行中为变量a赋值了,所以在第三行代码中会提示变量a的值为1,而不是undefined。
同理,第一个示例在函数声明前调用函数也是合法的,并能够被正确解析,所以返回值为1。
但是,如果按第二个方式定义函数,则JavaScript解释器会提示语法错误。这是因为,示例中定义的函数仅作为值赋值给变量f,所以在预编译期,JavaScript解释器只能够为声明变量f进行处理,而对于变量f的值,只能等到执行期时按顺序进行赋值,自然就会出现语法错误,提示找不到对象f。
f(); // 调用函数,返回值1
function f(){alert(1);}
f(); // 调用函数,返回语法错误
var f = function(){ alert(1);}
块相关
所谓代码块就是使用"script"标签分隔的代码段。例如,下面两个"script"标签分别代表两个JavaScript代码块。
JavaScript解释器在执行脚本时,是按块来执行的。通俗地说,就是浏览器在解析HTML文档流时,如果遇到一个"script"标签,则JavaScript解释器会等到这个代码块都加载完后,先对代码块进行预编译,然后再执行。执行完毕后,浏览器会继续解析下面的HTML文档流,同时JavaScript解释器也准备好处理下一个代码块。
由于JavaScript是按块执行的,所以如果在一个JavaScript块中调用后面块中声明的变量或函数就会提示语法错误。例如,当JavaScript解释器执行下面代码时就会提示语法错误,显示变量a未定义,对象f找不到。
<script>
// JavaScript代码块1
alert(a);
f();
</script>
<script>
// JavaScript代码块2
var a =1;
function f(){
alert(1);
}
</script>
参考资料