为什么有时优盘是只读模式_JS专题之严格模式

99404a71ca873b49694bfe3d8ba057cc.png

ECMAScript 5 引入了 strict mode ,现在已经被大多浏览器实现(从IE10开始)

一、什么是严格模式

顾名思义,JavaScript 严格模式就是让 JS 代码以更严格的模式执行,不允许可能会引发错误的代码执行。在正常模式下静默失败的代码,严格模式下就会抛出错误。

二、为什么要过渡到严格模式

  1. 严格模式下的代码在运行的时候,更容易通过抛出的错误定位到问题所在的地方
  2. 严格模式能够帮助你编写更符合规范的代码
  3. 消除 JavaScript 语言上一些不合理,比较怪异的行为
  4. 为未来新版本的 JavaScript 做铺垫
  5. 有时候,严格模式下的 JavaScript 代码运行起来更快

三、如何使用

· 脚本文件范围

"use strict"; 放在脚本文件的第一行。整个脚本文件就会以“严格模式”执行。

· 函数作用域范围

"use strict"; 放在函数体的第一行,则整个函数以"严格模式"运行。

文件合并时,写在脚本文件第一行的 "use strict"; 来实现严格模式会失效,可以将脚本文件的代码放在一个立即执行表达式中。

(funciton() {"use strict";...
})()

四、严格模式的具体定义

  1. 严格模式下无法再隐式创建全局变量 也就是,变量必须声明后才能使用,正常模式直接赋值给一个未定义的变量时,会将变量定义为全局变量。
"use strict";
var a = b = 3;  // Uncaught ReferenceError: b is not defined
​
以上代码等于:
var a;
b = 3;
a = b;
​
  1. 禁止 this 关键字指向全局对象 正常模式下,函数中如果没有指明 this 对象,JS 则会将 this 隐式指向为全局对象。如果绑定的值是非对象,将被自动转为对象再绑定上去,而 null 和 undefined 这两个无法转成对象的值,将被忽略。

严格模式下,必须指明 this 的指向对象。如果没有指明的话,this的值为 undefined

var name = "foo";
function func() {"use strict";this.name;  // Uncaught TypeError: Cannot read property 'name' of undefined
}
func();  // 没有加 new 关键字
new func();
​
function func() {return this
}
​
func() // window
func.call(8) // Number {8}
func.call(true) // Boolean {true}
func.call("abcd")  // {"abcd"}
func.call(null) // window
func.call(undefined) // window
​
"use strict"
function func() {return this
}
​
func() // undefined
func.call(8) // 8
func.call(true) // true
func.call(null) //null
func.call(undefined) // undefined
  1. 不允许在函数内部遍历调用栈 禁止使用 arguments.callee、arguments.caller、fn.caller、fn.callee; 在严格模式下,arguments.callee 是一个不可删除属性,而且赋值和读取时都会抛出异常
function func() {"use strict";func.caller;  // 报错func.arguments; // Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
}
func()
  1. 禁止向对象的只读属性赋值,禁止删除对象的不可设置属性, 禁止向不可扩展的对象添加属性 无法删除 var 声明的变量。

在正常模式中,给对象的只读属性赋值, 删除对象的不可设置属性,添加不可扩展对象的新属性,会静默失败。

但是在严格模式中,会抛出错误。 另外,字符串的属性 length 也是只读属性,修改后会报错。

"use strict";
var str = "abc"
str.length = 8  // Uncaught TypeError: Cannot assign to read only property 'length' of string 'abc'
​
'use strict';
var obj = Object.defineProperty({}, 'a', {value: 37,writable: false
});
obj.a = 123; // Uncaught TypeError: Cannot assign to read only property 'a' of object '#
​
'use strict';
var obj = Object.defineProperty({}, 'p', {value: 37,configurable: false
});
delete obj.p  // Uncaught TypeError: Cannot delete property 'p' of #<Object>
​
var obj = {};
Object.preventExtensions(obj);
obj.title = "hello";  // Uncaught TypeError: Cannot add property title, object is not extensible
  1. 对象不允许有重名的属性,函数不允许有重名的参数 在正常模式中,对象的重名属性,位置靠后会覆盖位置靠前的重名属性。函数也是,函数体查找到的参数,靠后的重名参数会覆盖靠前的重名参数。
"use strict";
var o = { p: 1,p: 2};
// IE报错:strict 模式下不允许一个属性有多个定义, 新版的 Chrome 和 firefox 并不会报错,会采用覆盖机制。
​
"use strict";
function func(a, a) {console.log(a)
}
func(1, 2) // IE报错: strict 模式下不允许正式参数名称重复。新版的 Chrome 和 firefox 并不会报错,会采用覆盖机制。
  1. 静态绑定 JavaScript 支持动态绑定,也就是 JavaScript 的属性和方法是在运行时确定,而不是在编译时确定。 于是,JavaScript 严格模式禁用了 with 语句, 因为使用了 with 语句,with 语句块中变量无法确定是外部全局变量还是传入的对象属性。
"use strict";
var x = 17;
with (obj) // !!! 语法错误
{// 如果没有开启严格模式,with 中的这个x会指向 with 上面的那个 x,还是obj.x?// 如果不运行代码,我们无法知道,因此,这种代码让引擎无法进行优化,速度也就会变慢。x; // Uncaught SyntaxError: Strict mode code may not include a with statement
}

eval 关键字不再会给上层函数(surrounding function)或者全局引入一个新的变量。在严格模式中,eval 语句会创建自己的一个作用域,eval 里的变量只能在 eval 内部使用。

  1. arguments 的限定 严格模式规定名称为 eval 和 arguments 不能通过程序语法被绑定(be bound)或赋值 严格模式下,参数的值不会随 arguments 对象的值的改变而变化。

正常模式中,对参数重新赋值,会修改 arguments 类数组对象下的参数值。同时,修改 arguments 类数组对象的值,也会修改函数参数的值。

严格模式下,不仅参数的值不会随着 arguments 类数组对象的变化而变化,参数的变化也不会引起 arguments 对象的变化,arguments 对象会记住参数的传入初始值。

function func(a) {
"use strict"a = 8;// arguments[0] = 8return [a, arguments[0]]
}
​
func(3) // [8, 3]
​
function func(a) {
"use strict"arguments[0] = 8return [a, arguments[0]]
}
​
func(3) // [3, 8]
  1. ES5禁止在非函数代码块声明函数 ES5 的严格模式只允许在全局作用域或函数作用域声明函数。也就是说,不允许在非函数的代码块内声明函数。
if (true) {function add() {}
}
add()for (var i = 0; i < 5; i++){function f2() { } // !!! 语法错误f2();
}以上代码在严格模式是禁止的,但是在 ES6 中,是允许在代码块中声明函数的。
  1. 保留关键字 严格模式中一部分字符变成了保留的关键字。这些字符包括implements, interface, let, package, private, protected, public, staticyield。在严格模式下,你不能再用这些名字作为变量名或者形参名
function private() {"use strict" }  //Uncaught SyntaxError: Unexpected strict mode reserved word
  1. 严格模式禁止八进制数字语法

五、向严格模式过渡

严格模式能够帮助我们写出更安全,更有规范的代码,则应该避免一些危险的写法,采用更好的写法:

  1. 变量先声明,再使用,
  2. this 应该在指向自己创建的对象时使用。
  3. arguments 应该在函数第一行就拷贝出来。

六、严格模式的缺点

  1. 现在的代码都会进行文件压缩和合并,此时严格模式就会失效。

总结

现在的 webpack 会在打包的时候默认是严格模式,所以现在不用再手动写 use strict了。严格模式能帮助我们以更规范的方式书写代码,但是无论是否严格模式,都应该注意代码的规范,避免隐式 bug 的出现。

2018/02/08 @Starbucks

欢迎关注我的个人公众号“谢南波”,专注分享原创文章。

fafe3bf9bedf83238868856581f0a680.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql router 介绍_MySQL Router 介绍篇

MySQL Router 是什么&#xff1f;相信还有很多人没有听说过MySQL Router&#xff0c;很多人对它还不了解&#xff0c;在这篇文章里&#xff0c;将对MySQL Router进行一个简明介绍。首先&#xff0c;介绍一下MySQL Router推出的背景。MySQL Router 是一个轻量级的中间件&#xf…

react 更新input 默认值setfieldsvalue_值得收藏的React面试题

react1、什么是虚拟DOM&#xff1f;难度: ⭐虚拟 DOM (VDOM)是真实 DOM 在内存中的表示。UI 的表示形式保存在内存中&#xff0c;并与实际的 DOM 同步。这是一个发生在渲染函数被调用和元素在屏幕上显示之间的步骤&#xff0c;整个过程被称为调和。2、类组件和函数组件之间的区…

实验二Step1-有序顺序表

1 #include<stdio.h>2 3 struct job4 {5 char name[10];//作业名称6 char status;//当前状态7 int arrtime;//到达时间8 int reqtime;//要求服务时间9 int startime;//调度时间 10 int finitme;//完成时间 11 float TAtime,TAWtime;//周转时…

ocx控件 postmessage消息会消失_APP控件之二——弹框

弹框分为两种&#xff1a;模态弹框和非模态弹框一、模态弹框模态弹框和非模态弹框最大的区别就是是否强制用户交互。模态弹框会打断用户的当前操作流程&#xff0c;用户不在弹框上操作的话&#xff0c;其余功能都使用不了。优点是&#xff1a;可以很好的获取的用户的视觉焦点缺…

结对编程(1)

我的结对编程项目搭档是王以正&#xff0c;我们的代码也是基于他个人项目的代码修改的。 由于王以正同学不在宿舍住也不怎么会宿舍&#xff0c;我们结对编程的时间较少&#xff0c;不过他将他的代码代码放到了github上面&#xff0c;这也让我有机会学习了github的使用。感觉这个…

伪代码block转换成程序流程图_程序设计基础

1、程序与程序设计语言的基本知识1&#xff09;程序&#xff1a;为解决某一问题而采用程序设计语言编写的一个指令集合。程序算法&#xff08;对操作的描述&#xff09;数据结构&#xff08;对数据的描述&#xff09;程序设计语言语言工具和环境。2&#xff09;程序的特点&…

mysql 内联函数_C++之内联函数

C继承C的一个重要特性是效率&#xff0c;在C中保护效率的一个方法是使用宏(macro),宏的实现是使用预处理器而不是编译器&#xff0c;预处理器直接用宏代码替换宏调用&#xff0c;所以就没有了参数压栈、生成汇编语言的CALL、返回参数、执行汇编语言的RETURN的时间花费&#xff…

10桌面管理文件收纳_二十余件精选桌面好物推荐,让学习工作生活满满正能量!...

这些提升办公桌幸福感的好物&#xff0c;能让你的学习与工作正能量满满&#xff01;01 笔记本支架笔记本是为了人们出行方便而设计的&#xff0c;显示器的位置并没有照顾到长期对着显示器码字的人群&#xff0c;许多以笔记本为主力的办公族也被迫成为了低头族。绿巨能(llano)笔…

hash 值重复_面试题:HashSet是如何保证元素不重复的

面试官&#xff1a;你能简单介绍List和Set有什么区别吗&#xff1f;小憨&#xff1a;List是一个有序的集合&#xff0c;在内存是连续存储的&#xff0c;可以存储重复的元素&#xff0c;List查询快&#xff0c;增删慢&#xff1b;Set是一个无序的集合&#xff0c;在内存中不连续…

RabbitMQ 原文译03--发布和订阅

发布/订阅 在之前的案例中我们创建了一个工作队列,这个工作队列的实现思想就是一个把每一个任务平均分配给每一个执行者,在这个篇文章我们会做一些不一样的东西,把一个消息发送给多个消费者,这种模式就被称作"发布/订阅". 为了说明这个模式,我们将要创建一个简单的日…

html富文本编辑器插件_vue中使用vuequilleditor富文本编辑器

点击上方“小姚同学技术栈”快速关注我哟&#xff01;vue-quill-editor是一个基于quill、适用于vue的富文本编辑器开源项目&#xff0c;支持服务端渲染和单页应用。目前项目热度还算可以&#xff0c;如果不考虑使用markdown&#xff0c;vue-quill-editor是一个比较好的选择。本…

二元函数图像生成器_GAN生成图像综述

点击上方“CVer”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达作者&#xff1a;YTimo(PKU EECS) 研究方向&#xff1a;深度学习&#xff0c;计算机视觉本文转载自&#xff1a;SIGAI摘要生成对抗网络(Generative adversarial network, GAN)…

设计模式之禅读书笔记

》设计原则《 》Single Responsibility Principle&#xff08;单一职责原则&#xff09;类只有一个修改的原因。 ●类的复杂性降低&#xff0c;实现什么职责都有明确的定义。 ●可读性高 ●可维护性高 ●变更引起的风险降低。 PS&#xff1a;基本不可能实现 》里氏替换原则&…

mysql mysql_set_charset_SQL注入攻击之 mysql_set_charset [转]

本文转载地址&#xff1a;http://hi.baidu.com/cuttinger/blog/item/e9a93901934755147bec2cb0.html1。老话题&#xff0c;mysql_real_escape_string单引号&#xff0c;大多数情况下&#xff0c;防止sql注入攻击足够了。$mysql mysql_connect("host","user&quo…

idea导入maven项目依赖报错_解决Maven依赖冲突的好帮手,这款IDEA插件了解一下?

1、何为依赖冲突Maven是个很好用的依赖管理工具&#xff0c;但是再好的东西也不是完美的。Maven的依赖机制会导致Jar包的冲突。举个例子&#xff0c;现在你的项目中&#xff0c;使用了两个Jar包&#xff0c;分别是A和B。现在A需要依赖另一个Jar包C&#xff0c;B也需要依赖C。但…

java线程创建方式_Java创建线程安全的方法

原文链接 译者&#xff1a;秦建平 校对&#xff1a;方腾飞首先来看一个问题&#xff1a;下面这个方法是线程安全的吗&#xff1f;如何才能让这个方法变成线程安全的&#xff1f;public class MyCount {private static int counter 0;public static int getCount(){return coun…

win7 能下node什么版本_微软从未公开的win10版本,3GB+极度精简,老爷机有救了

在windows家族中&#xff0c;最好用的就是win7和XP系统。堪称经典&#xff0c;而且还是发展最成功的系统版本。前几天韩博士也发布一篇关于XP系统的文章&#xff0c;评论区引发极大争论。大家众说纷纭&#xff0c;觉得XP系统是顺畅&#xff0c;但是很多软件硬件都不支持&#x…

【Swift学习】Swift编程之旅(一)

学习一门新语言最经典的例子就是输出“Hello World&#xff01;” print("Hello World!")  swift就是这样来输出的。 如果你使用过其他语言&#xff0c;那么看上去是非常的熟悉吧。但比一些c要简单的多吧 1、不需要导入一些单独的库&#xff0c;比如输入/输出或字符…

孔夫子二手书采集

文章目录 项目演示软件采集单本数据网页搜索数据对比 使用场景概述部分核心逻辑Vb工程图数据导入与读取下拉框选择参数设置线程 使用方法下载软件授权导入文件预览处理后的数据 项目结构附件说明 项目演示 操作视频详见演示视频&#xff0c;以下为图文演示 软件采集单本数据 …

为什么用redis做缓存而不是mybatis自带的缓存_如何用Java设计一个本地缓存,涨姿势了...

最近在看Mybatis的源码&#xff0c;刚好看到缓存这一块&#xff0c;Mybatis提供了一级缓存和二级缓存&#xff1b;一级缓存相对来说比较简单&#xff0c;功能比较齐全的是二级缓存&#xff0c;基本上满足了一个缓存该有的功能。当然如果拿来和专门的缓存框架如ehcache来对比可能…