《JavaScript 语法.docx》由会员分享,可在线阅读,更多相关《JavaScript 语法.docx(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、JavaScript 语法ES2015(ES6)新增加了两个重要的JavaScript关键字:let 和 constolet声明的变量只在let命令所在的代码块内有效。const声明一个只读的常量,一旦声明,常量的值就不能 改变。在ES6之前,JavaScript只有两种作用域:全局变量与函 数内的局部变量。在函数外声明的变量作用域是全局的:全局变量在JavaScript程序的任何地方都可以访问。在函数内声明的变量作用域是局部的(函数内):函数内使用var声明的变量只能在函数内容访问,如果不 使用var那么是全局变量。const x = 2;这里输出x为2)这里输出x为10const声明的常量
2、必须初始化:/错误写法const PI;PI = /正确写法const PI = const的本质:const定义的变量并非常量,并非不可变, 它定义了一个常量引用一个值。使用const定义的对象或者数 组,其实是可变的。下面的代码并不会报错:但是我们不能对常量对象重新赋值:以下实例修改常量数组:但是我们不能对常量数组重新赋值:Internet Explorer 10及更早版本的浏览器不支持const关 键字。下表列出了各个浏览器支持const关键字的最低版本号。使用var关键字声明的变量在任何地方都可以修改:在相同的作用域或块级作用域中,不能使用const关键字 来重置var和let关键字声
3、明的变量:var x = 2;/ 合法const x = 2;/ 不合法let x = 2;/ 合法const x = 2; / 不合法)在相同的作用域或块级作用域中,不能使用const关键字 来重置const关键字声明的变量:const x = 2;/ 合法const x = 3;/ 不合法x = 3;/不合法var x = 3;/不合法let x = 3;/不合法const x = 2; / 合法const x = 3; / 不合法x = 3;/不合法var x = 3;/不合法let x = 3;/不合法)const关键字在不同作用域,或不同块级作用域中是可以 重新声明赋值的:const
4、 x = 2;/ 合法(const x = 3; / 合法const x = 4; 合法 )JavaScript var关键字定义的变量可以在使用后声明,也 就是变量可以先使用再声明(JavaScript变量提升卜const关键字定义的变量那么不可以在使用后声明,也就是 变量需要先声明再使用。carName = Volvo; /在这里不可以使用carName变量const carName = Volvo;在学习本章节内容前,你需要先了解什么是异步编程,可 以参考:JavaScript异步编程Promise是一1k ECMAScript 6提供的类,目的是更加优 雅地书写复杂的异步任务。由于Pr
5、omise是ES6新增加的,所以一些旧的浏览器并 不支持,苹果的Safari 10和Windows的Edge 14版本以上浏 览器才开始支持ES6特性。以下是Promise浏览器支持的情况:现在我们新建一Promise对象:new Promise(function (resolve, reject) 要做的事情);通过新建一个Promise对象好像并没有看出它怎样“更加 优雅地书写复杂的异步任务”。我们之前遇到的异步任务都是一 次异步,如果需要屡次调用异步函数呢?例如,如果我想分三 次输出字符串,第一次间隔1秒,第二次间隔4秒,第三次间 隔3秒:这段程序实现了这个功能,但是它是用“函数瀑布”来
6、实现 的。可想而知,在一个复杂的程序当中,用“函数瀑布”实现的 程序无论是维护还是异常处理都是一件特别繁琐的事情,而且会让缩进格式变得非常冗赘。现在我们用Promise来实现同样的功能: 这段代码较长,所以还不需要完全理解它,我想引起注意的是Promise将嵌套格式的代码变成了顺序格式的代码。下面我们通过剖析这段Promise ”计时器”代码来讲述Promise的使用:Promise构造函数只有一个参数,是一函数,这个函数在构造之后会直接被异步运行,所以我们称之为起始函数。起 始函数包含两个参数resolve和rejecto当Promise被构造时,起始函数会被异步执行: 这段程序会直接输出R
7、un。resolve和reject都是函数,其中调用resolve代表一切正 常,reject是出现异常时所调用的:这段程序执行结果是:EndPromise 类有.then() .catch()和.finally()三个方法,这三 个方法的参数都是一个函数,.then()可以将参数中的函数添加 到当前Promise的正常执行序列,.catch。那么是设定Promise 的异常处理序列,.finally。是在Promise执行的最后一定会执 行的序列。.then。传入的函数会按顺序依次执行,有任何异常都会直 接跳到catch序列:执行结果:111122223333An errorresolve(
8、)中可以放置一个参数用于向下一个then传递一个值,then中的函数也可以返回一个值传递给then。但是,如果then中返【的是一个Promise对象,那么下一个then将相当于对这个返【当于对这个返【的Promise进行操作,这一点从刚才的计时器的例子中可以看出来。reject()参数中一般会传递一个异常给之后的catch函数用 于处理异常。但是请注意以下两点:resolve和reject的作用域只有起始函数,不包括then以 及其他序列;resolve和reject并不能够使起始函数停止运行,别忘了 return o上述的“计时器”程序看上去比函数瀑布还要长,所以我们 可以将它的核心局部写
9、成一个Promise函数:然后我们就可以放心大胆的实现程序功能了:这种返回值为一1k Promise对象的函数称作Promise函数,它常常用于开发基于异步操作的库。Q: then, catch和finally序列能否顺序颠倒?A:可以,效果完全一样。但不建议这样做,最好按 then-catch-finally的顺序编写程序。Q:除了 then块以外,其它两种块能否屡次使用?A:可以,finally与then 一样会按顺序执行,但是catch块 只会执行第一个,除非catch块里有异常。所以最好只安排一 个 catch 和 finally 块。Q: then块如何中断?A: then块默认会向
10、下顺序执行.return是不能中断的,可 以通过throw来跳转至catch实现中断。Q:什么时候适合用Promise而不是传统回调函数?A:当需要屡次顺序执行异步操作的时候,例如,如果想通 过异步方法先后检测用户名和密码,需要先异步检测用户名, 然后再异步检测密码的情况下就很适合Promiseo使用var关键字声明的变量不具备块级作用域的特性,它在。外依然能被访问到。var x = 2;)这里可以使用X变量 在ES6之前,是没有块级作用域的概念的。ES6可以使用let关键字来实现块级作用域。let声明的变量只在let命令所在的代码块内有效,在之外不能访问。let x = 2;Q: Promi
11、se是一种将异步转换为同步的方法吗?A:完全不是。Promise只不过是一种更良好的编程风格。Q:什么时候我们需要再写一个then而不是在当前的then 接着编程?A:当你又需要调用一个异步任务的时候。异步函数(async function )是 ECMAScript 2017 (ECMA-262)标准的规范,几乎被所有浏览器所支持,除了 Internet Explorero在Promise中我们编写过一Promise函数:然后用不同的时间间隔输出了三行文本:我们可以将这段代码变得更好看:哈!这岂不是将异步操作变得像同步操作一样容易了吗!这次的回答是肯定的,异步函数async function
12、中可以使 用await指令,await指令后必须跟着一个Promise ,异步函数会在这个Promise运行中暂停,直到其运行结束再继续运行。异步函数实际上原理与Promise原生API的机制是一模一 样的,只不过更便于程序员阅读。处理异常的机制将用try-catch块实现:如果Promise有一个正常的返【值,await语句也会返回程序会输出:Return valueJavaScript Promise 对象这里不能使用X变量 使用var关键字重新声明变量可能会带来问题。在块中重新声明变量也会重新声明块外的变量:let关键字就可以解决这个问题,因为它只在let命令所在 的代码块内有效。Int
13、ernet Explorer 11及更早版本的浏览器不支持let关键 字。下表列出了各个浏览器支持let关键字的最低版本号。使用var关键字:使用let关键字:在第一个实例中,使用了 var关键字,它声明的变量是全 局的,包括循环体内与循环体外。在第二个实例中,使用let关键字,它声明的变量作用域只在循环体内,循环体外的变量不受影响。在函数体内使用var和let关键字声明的变量有点类似。它们的作用域都是局部的:/使用varfunction myFunction() var carName = Volvo; / 局部作用域)/使用letfunction myFunction() let carN
14、ame = Volvo; / 局部作用域) 在函数体外或代码块外使用var和let关键字声明的变量也有点类似。它们的作用域都是全局的:/使用varvar x = 2;全局作用域/使用letlet x = 2;全局作用域在JavaScript中,全局作用域是针对JavaScript环境。在HTML中,全局作用域是针对window对象。使用var关键字声明的全局作用域变量属于window对象:使用let关键字声明的全局作用域变量不属于window对象:使用var关键字声明的变量在任何地方都可以修改:在相同的作用域或块级作用域中,不能使用let关键字来 重置var关键字声明的变量:var x = 2
15、;/ 合法let x = 3;/不合法var x = 4; / 合法let x = 5 /不合法)在相同的作用域或块级作用域中,不能使用let关键字来 重置let关键字声明的变量:let x = 2;/ 合法let x = 3;/不合法let x = 4; / 合法let x = 5; /不合法)在相同的作用域或块级作用域中,不能使用var关键字来 重置let关键字声明的变量:let x = 2;/ 合法var x = 3;/不合法let x = 4; / 合法var x = 5; /不合法)let关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的:let x = 2;/ 合法let
16、x = 3; / 合法)let x = 4; / 合法)JavaScript中,var关键字定义的变量可以在使用后声明, 也就是变量可以先使用再声明(JavaScript变量提升卜let关键字定义的变量那么不可以在使用后声明,也就是变量 需要先声明再使用。/在这里不可以使用carName变量let carName;const用于声明一个或多个常量,声明时必须进行初始化, 且初始化后值不可再修改:定义常量与使用定义的变量相似:二者都是块级作用域都不能和它所在作用域内的其他变量或函数拥有相同的名 称两者还有以下两点区别:声明的常量必须初始化,而声明的变量不用const定义常量的值不能通过再赋值修改,也不能再次声 明。而let定义的变量值可以修改。varx = 10;这里输出x为10