某某茶叶有限公司欢迎您!
金沙棋牌在线 > 服务器&运维 > Javascript的严格模式strict mode详细介绍_javascript技巧_脚本之家

Javascript的严格模式strict mode详细介绍_javascript技巧_脚本之家

时间:2019-12-01 20:09

Promise 编程模式也被称为 thenable,可以理解为 延迟后执行。每个 Promise 都拥有一个叫做 then 的唯一接口,当 Promise 失败或成功时,它就会进行回调。它代表了一种可能会长时间运行而且不一定必须完成的操作结果。这种模式不会阻塞和等待长时间的操作完成,而是返回一个代表了承诺的结果的对象。

在我们开始正式介绍之前,我们想看看Javascript Promise的样子:复制代码 代码如下:var p = new Promise(function { resolve;p.then { alert返回一个Forked Promise

“严格模式”是ECMA-262 Edition 5定义的新语法,表示要用严格的Javascript语法来执行,有一些过去惯用的写法就会抛出SyntaxError异常,例如:1.变量前没有用var宣告2.使用八进制语法:var n = 023和var s = "47"3.使用with语句4.使用delete删除一个变量名:delete myVariable5.使用eval或arguments作为变量名或函数名6.使用未来保留字:implements, interface, let, package, private, protected, public, static,和yield作为变量名或函数名7.在语句块中使用函数声明:if{} }8.其他错误8.1.对象子面量中使用两个相同的属性名:{a: 1, b: 3, a: 7}8.2.函数形参中使用两个相同的参数名:function f{}这些下面具体说明。

当前的许多 JavaScript 库(如 jQuery 和 Dojo、AngularJS)均添加了这种称为 Promise 的抽象。通过这些库,开发人员能够在实际编程中使用 Promise 模式。

以下两段代码有什么区别呢?

一、为什么使用”严格模式”设立”严格模式”的目的,主要有以下几个:

下面我们将以 jQuery 为例讨论 JavaScript 库是如何使用 Promise 模式的来处理异步的,其实就是通过回调的方式提供容错支持。在某个操作成功或失败或任何情况下都执行对应的回调,尽量把某段逻辑可能出现的情况都 handle 住。

复制代码 代码如下:// Exhibit Avar p = new Promise;p.then;// Exhibit Bvar p = new Promise;p.then;如果你认真以上两段代码等同的话,那么Promises只不过是一个一维的回调函数数组。然而,其实不是这样的。每一个then()调用都返回一个forked promise。因此,ExhibitA中,如果func1仍旧正常调用。

1.消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;2.消除代码运行的一些不安全之处,保证代码运行的安全;3.提高编译器效率,增加运行速度;4.为未来新版本的Javascript做好铺垫。

首先让我们来看看 jQuery 一般是如何操作的:

在ExhibitB中,如果func1将不会被调用,因为第一个调用返回了一个新的promise,这个在func1被跳过。

“严格模式”体现了Javascript更合理、更安全、更严谨的发展方向,包括IE 10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱它。

复制代码 代码如下:var $info = $;$.ajax({ url:"/echo/json/", data: { json: JSON.stringify({"name": "someValue"}) }, type:"POST", success: function { $info.text;

总结:promises可以被fork成多个路径,类似复杂的流程图。

另一方面,同样的代码,在”严格模式”中,可能会有不一样的运行结果;一些在”正常模式”下可以运行的语句,在”严格模式”下将不能运行。掌握这些内容,有助于更细致深入地理解Javascript,让你变成一个更好的程序员。

在这个例子中,你可以看到当设置成功后会指定一个回调,是一种很好的回调方式,这并不是 Promise,jQuery 官方文档也不再推荐这种方式( 当 Ajax 调用完成后,它便会执行 success 函数。根据库所使用的异步操作,你可以使用各种不同的回调。使用 Promise 模式会简化这个过程,异步操作只需返回一个对象调用。这个 Promise 允许你调用一个叫做 then 的方法,然后让你指定回调的 function 个数。

  1. Callback应该传递结果

本文将对”严格模式”做详细介绍。

下面让我们来看看 jQuery 是如何建立 Promise 的:复制代码 代码如下:var $info = $;$.ajax({ url: "/echo/json/", data: { json: JSON.stringify({ "name": "someValue" }) }, type: "POST"}).then { $info.text;

当你运行下面代码的时候什么会得到警告提示呢?复制代码 代码如下:var p = new Promise(function { resolve;p.then.then { alert中的alert没有显示任何内容。这是因为回调函数,在promise的上下文中,因为结果的变化并没有回调函数。promise期望你的回调函数返回同样的结果或者返回一个替换结果,然后被传递到下一个回调函数中。

二、宣告”严格模式”

jQuery ajax 对象通过返回 xhr 对象实现 Promise 模式,所以我们可以调用 then 方法,这样做的优势是你可以链式调用,实现独立操作,如下所示 :

类似使用adpater来变化结果,如下:复制代码 代码如下:var feetToMetres = function { return ft*12*0.0254 };var p = new Promise;p.then.then { alert; 3. 只有来自上一层的异常可以被捕捉

宣告”严格模式”很简单只有一条语句:复制代码 代码如下:"use strict";注:老版本的浏览器会把它当作一行普通字符串,加以忽略。

复制代码 代码如下:var $info = $;$.ajax({ url: "/echo/json/", data: { json: JSON.stringify({ "name": "someValue" }) }, type: "POST"}).then { $info.text.then { $info.append.done { $info.append;

这两段代码有什么区别?复制代码 代码如下:// Exhibit Anew Promise(function { resolve.then { throw new Error; }, undefined).then( undefined, function; });

三、宣告”严格模式”的位置及上下文关系

由于许多库都开始采用 Promise 模式,所以异步操作会变的非常容易。但如果站在相反的角度思考,Promise 将会是什么样子的呢?其中一个非常重要的模式是函数可以接受两种功能,一个是成功时的回调,另一个是失败时的回调。

// Exhibit Bnew Promise(function { resolve.then { throw new Error; }, function; });在第一段代码中,在第一个then捕捉,然后“uh oh”警告将会被触发。这个遵循只有前一个层次的异常会被捕捉。

“严格模式”主要是影响他所在的scope,如果在函数中使用,并不会让global scope以及其他未使用的函数变成”严格模式”。也就是说 严格模式声明的范围取决于其上下文。 如果在全局上下文中声明严格模式,则程序中的所有代码都处于严格模式。 如果在函数中声明严格模式,则函数中的所有代码都处于严格模式。 例如,在下面的示例中,所有代码都处于严格模式,并且函数外部的变量声明会导致出现语法错误:“严格模式下未定义变量”。”严格模式”有两种调用方法,适用于不同的场合。

复制代码 代码如下:var $info = $;

在第二段代码中,回调函数和错误回调函数是同一个层次,意味着当异常在回调中抛出,将不会被捕捉。事实上,第二段代码的错误回调将只会在promise为拒绝状态或者promise本身出错的情况下抛出

1.针对整个脚本文件

$.ajax({// Change URL to see error happen url: "/echo/json/", data: { json: JSON.stringify({ "name": "someValue" }) }, type: "POST"}).then {// success $info.text;},function () {// failure $info.text("bad things happen to good developers");}).always { $info.append;

  1. 错误可以被恢复

将”use strict”放在脚本文件的第一行,则整个脚本都将以”严格模式”运行。如果这行语句不在第一行,则无效,整个脚本以”正常模式”运行。如果不同模式的代码文件合并成一个文件,这一点需要特别注意。(严格地说,只要前面不是产生实际运行结果的语句,”use strict”可以不在第一行,比如直接跟在一个空的分号后面。)

需要注意的是,在 jQuery 里,无论成功还是失败,我们都会使用一个调用来指定我们想要调用的。其实这里也可以这样来写,这也是 jQuery 官方文档里推荐的方法:

在一个错误回调函数中,如果你不重新抛出错误,promise会假设你已经从错误中恢复,并且反转成为已解决状态。在下一个例子中,"i'm saved" 将会被显示,这是因为在第一个then()中的错误回调没有重新抛出异常。复制代码 代码如下:var p = new Promise(function { reject;});p.then( undefined, function.then { alert; }, function { alert;Promise可以被看作洋葱上的层次。每一个then()添加另外一个层次到洋葱上。每一个层次代表了一个被处理的活动。当层次结束,结果被认为已经修复并且为下一个层次做好了准备。

复制代码 代码如下:

复制代码 代码如下:var $info = $;

  1. Promises可以被暂停

上面的代码表示,一个网页中依次有两段Javascript代码。前一个script标签是严格模式,后一个不是。

$.ajax({// Change URL to see error happen url: "/echo/json/", data: { json: JSON.stringify({ "name": "someValue" }) }, type: "POST"}).done { // success $info.text.fail { // failure $info.text("bad things happen to good developers");}).always { $info.append;

因为你已经准备好了在一个then()方法中执行,并不意味着你不能够暂停并且提前运行其他。 为了暂停目前的promise,或者让它等待以便另外一个promise完成,简单在then()中返回另外一个promise。复制代码 代码如下:var p = new Promise;p.then { if { return new Promise.then { alert在前面代码中,直到新的promise解析后提示才会出现。这是一个方便的方式在已存在的异步代码路径中来引入更多地依赖。例如,你可能发现用户session已经timeout,并且你可能希望在继续前面的代码路径前初始化第二个登陆。

2. 针对单个函数

下面再来看看 AngularJS 是如何使用 Promise 模式的:

  1. Resolved Promises并不会立刻执行

将”use strict”放在函数体的第一行,则整个函数以”严格模式”运行。复制代码 代码如下:function strict(){"use strict";return "这是严格模式。";}function notStrict() {return "这是正常模式。";}3.脚本文件的变通写法因为第一种调用方法不利于文件合并,所以更好的做法是,借用第二种方法,将整个脚本文件放在一个立即执行的匿名函数之中。复制代码 代码如下:{

复制代码 代码如下:var m = angular.module;

运行下面代码会得到提示框么?复制代码 代码如下:function runme() { var i = 0; new Promise { resolve .then { i += 2; }); alert;}因为promise被立刻解析,然后then()方法被立刻执行,所以你可能会认为会探出提示2。但是promise定义要求所有的调用都被强制异步。因此提示会在被修改前生成。

"use strict";// some code here