1Javascript基础语言

130 阅读5分钟

语法

      ECMAScript的语法很大程度上借鉴了C语言和其他类C语言,如Java和Perl。熟悉这些语言的开发者,应该很容易理解ECMAScript宽松语法

区分大小写

      首先要知道的是,ECMASript中的一切都区分大小写。无论是变量,函数名还是操作符,都区分大小写,换句话说,变量test和变量Test是两个不同的变量,类似地,typeof不能作为函数名,因为他是一个关键字,但Typeof是一个完全有效的函数名(此处的Typeof是大写T开头的)

标识符

      所谓标识符,就是变量,函数,属性或函数参数的名称,标识符可以有一个或者多个下列字符组成:

  • 第一个字符必须是一个字母,下划线(_),或者美元符号($);
  • 剩下的其他字符可以是字母,下划线,美元符号或数字,

 注释

      ECMAScript采用啦C语言风格的注释,包括单行注释和块注释,单行注释以两个斜杠字符开头,如:

      

块注释以一个斜杠和一个星号(/*)开头,以它们的反向组合(*/)结尾,如:

严格模式

      ECMAScript5增加啦严格模式(struct mode)的概念。严格模式是一种不同Javascript解析和执行模型,ECMAScript3的一些不规范写法在这种模式下回被处理,对于不安全的活动将抛出错误,要对整个脚本启用严格模式,在脚本开头加上这一行

      “use strict”;

      虽然看起来像个没有赋值给任何变量的字符串,但它其实是一个预处理指令,任何支持Javascript引擎看到它都会切换到严格模式,选择这种语法形式的目的是不破坏ECMAScript3语法,

      也可以单独指定一个函数在严格模式下执行,只要把这个预处理指令放到函数开头即可;

语句

      ECMAScript 中的语句以分号结尾,省略分号意味着有解析器确定语句在哪里结尾,如下面的例子:

      即使语句末尾的分号不是必需的,也应加上,记着加分号有助于防止省略造成的问题,比如可以避免输入内容不完整,此外,加分号也便于开发者通过删除空格来压缩代码(如果没有结尾的分号,只删除空格,则会导致语法错误)。加分号也助于在某些情况下提升性能,因为解析器会尝试在合适位置补上分号以纠正语法错误,

      多条语句可以合并到一个C语言风格的代码块中,代码块有一个左花括号({)标识开始,一个右花括号(})标识结束,

      if之类的控制语句只在执行多条语句时要求必须有代码块,不过最佳实践是始终在控制语句中使用代码块,即使要执行一条语句,如下列所示:

      在控制语句中使用代码块可以让内容更清晰,在需要修改代码时也可以减少出错的可能性

变量

      ECMAScript 变量是松散类型的,意思是变量可以用于保存任何类型的数据,每个变量只不过是一个用于保存任意值的命占位符,有 3 个关键字可以声明变量:var,const 和 let 。其中var在ECMAScript的所有版本中都可以使用,而 const 和 let 只能在ECMAScript 6 及更晚的版本中使用。

var 关键字

      要定义变量,可以使用 var 操作符( 注意 var 是一个关键字 ),后跟变量名( 即标识符,如前所述 )

      

      这行代码定义了一个名为 message 的变量,可以用它保存任何类型的值。( 不初始化的情况下,变量会保存一个特殊值 undefined ),ECMAScript 实现变量初始化,因此可以同时定义变量并设置它的值:

      在这个例子中,变量 message 首先被定义为一个保存字符串值 hi 的变量,然后又被重写为保存啦数值 100,虽然不推荐改变变量保存值的类型,但这在ECMAScript 中完全有效的,

      1.var 声明作用域

       关键的问题在于,使用 var 操作符定义的变量会成为包含它的函数的局部变量。比如,使用 var 在一个函数内部定义一个变量,就意味着该变量将在函数退出时被销毁:

      这里,message 变量时在函数内部使用 var 定义的。函数叫 test(),调用它会创建这个变量并给它赋值。调用之后变量随即被销毁,因此示例中的最后一行会导致错误。不过,在函数内定义变量时省略 var 操作符,可以创建一个全局变量:

      去掉之前的 var 操作符之后,message 就变成啦全局变量。只要调用一次函数 test(),就会定义这个变量,并且可以在函数外部访问到。

注意⚠️,虽然可以通过省略 var 操作符定义全局变量,但不推荐这么做,在局部作用域中定义的全局变量很难维护,也会造成困惑,这是因为不能一下子断定省略 var 是不是有意而为之。在严格模式下,如果像这样给未声明的变量赋值,则会导致抛出 ReferenceError

      如果需要定义多个变量,可以在一条语句中用逗号分隔每个变量( 及可选的初始化 ):

2. var 声明提升

      使用 var 时,下面的代码不会报错,这是因为使用这个关键字声明的变量会自动提升到函数作用域顶部:

      之所以不会报错,是因为 ECMAScript 运行时把它看成等价于如下代码:

      这就是所谓的  ”提升“ ( hoist ),也就是把所有的变量声明都拉到函数作用域的顶部,此外,反复多次使用var声明同一个变量也没有问题: