(81)Wangdao.com第十六天_JavaScript 严格模式
严格模式
除了正常的运行模式,JavaScript 还有第二种运行模式:严格模式(strict mode)。顾名思义,这种模式采用更加严格的 JavaScript 语法
同样的代码,在正常模式和严格模式中,可能会有不一样的运行结果。
一些在正常模式下可以运行的语句,在严格模式下将不能运行。
- 设计目的
- 早期的 JavaScript 语言有很多设计不合理的地方,但是为了兼容以前的代码,又不能改变老的语法,
- 只能不断添加新的语法,引导程序员使用新语法
- 严格模式是从 ES5 进入标准的,主要目的有以下几个。
- 明确禁止一些不合理、不严谨的语法,减少 JavaScript 语言的一些怪异行为
- 增加更多报错的场合,消除代码运行的一些不安全之处,保证代码运行的安全
- 提高编译器效率,增加运行速度
- 为未来新版本的 JavaScript 语法做好铺垫
- 启用方法
进入严格模式的标志,是一行字符串 use strict;
'use strict';
- 在整个脚本文件 启用
- 放在脚本文件的第一行,整个脚本都将以严格模式运行。
<script>
'use strict';
console.log('这是严格模式');
</script>
<script>
console.log('这是正常模式');
</script>
- 只在单个函数中 启用
- use strict; 放在函数体的第一行,则整个函数以严格模式运行
- 在整个脚本文件 启用
- 有时,需要把不同的脚本合并在一个文件里面。
- 如果一个脚本是严格模式,另一个脚本不是,它们的合并就可能出错。
- 严格模式的脚本在前,则合并后的脚本都是严格模式
- 如果正常模式的脚本在前,则合并后的脚本都是正常模式
- 有时,需要把不同的脚本合并在一个文件里面。
- 这时可以考虑把整个脚本文件放在一个立即执行的匿名函数之中
(function () {
'use strict';
// some code here
})();
- 这时可以考虑把整个脚本文件放在一个立即执行的匿名函数之中
- 显示报错
严格模式使得 JavaScript 的语法变得更严格,更多的操作会显式报错
其中有些操作,在正常模式下只会默默地失败,不会报错
- 只读属性不可写
- 严格模式下,设置字符串的 length 属性,会报错 // TypeError: Cannot assign to read only property 'length' of string 'abc'
- 删除不可配置(non-configurable)属性都会报错
- 只读属性不可写
- 禁止扩展的对象不可扩展
- 严格模式下,对禁止扩展的对象添加新属性,会报错
'use strict';
var obj = {};
Object.preventExtensions(obj); obj.v = 1; // Uncaught TypeError: Cannot add property v, object is not extensible
- 严格模式下,对禁止扩展的对象添加新属性,会报错
- 禁止扩展的对象不可扩展
- 严格模式下,对一个只有取值器(getter)、没有存值器(setter)的属性赋值,会报错
- eval、arguments 不可用作标识名
- 函数不能有重名的参数
- 禁止八进制的前缀0表示法
- 增强的安全措施
- 全局变量必须显式声明
- 禁止 this 关键字指向全局对象
- 函数禁止使用 fn.callee fn.caller
- 禁止使用 arguments.callee、arguments.caller
- 只有对象的属性,且属性的描述对象的 configurable 属性设置为 true,才能被 delete 命令删除
- 禁止使用 arguments.callee、arguments.caller
- 禁止删除window 的变量
- 静态绑定
- JavaScript 语言的一个特点,就是允许 “动态绑定”,
- 即某些属性和方法到底属于哪一个对象,不是在编译时确定的,而是在运行时(runtime)确定的。
- 某些情况下,只允许静态绑定。也就是说,属性和方法到底归属哪个对象,必须在编译阶段就确定。
- 这样做有利于编译效率的提高,也使得代码更容易阅读,更少出现意外。
- 禁止使用 with 语句
- 因为
with语句无法在编译时就确定,某个属性到底归属哪个对象,从而影响了编译效果
- 因为
- 禁止使用 with 语句
创设 eval 作用域
- 正常模式下,JavaScript 语言有两种变量作用域(scope):全局作用域和函数作用域
- 严格模式创设了第三种作用域:
eval作用域 - eval 所生成的变量只能用于 eval 内部
(function () {
'use strict';
var x = 2;
console.log(eval('var x = 5; x')) //
console.log(x) //
})()
- 如果希望
eval语句也使用严格模式,有两种方式// 方式一
function f1(str){
'use strict';
return eval(str);
} f1('undeclared_variable = 1'); // 报错 // 方式二
function f2(str){
return eval(str);
} f2('"use strict";undeclared_variable = 1') // 报错
- arguments 不再追踪参数的变化
- 变量
arguments代表函数的参数。严格模式下,函数内部改变参数与arguments的联系被切断了,两者不再存在联动关系
- 变量
非函数代码块不得声明函数
- 只允许在全局作用域或函数作用域声明函数
- 保留字
- implements、interface、let、package、private、protected、public、static、yield等
- 保留字
(81)Wangdao.com第十六天_JavaScript 严格模式的更多相关文章
- (80)Wangdao.com第十六天_JavaScript Object 对象的相关方法
Object 对象的相关方法 Object.getPrototypeOf() 返回参数对象的原型. 这是获取某对象的原型对象的标准方法. var F = function () {}; var f = ...
- (82)Wangdao.com第十六天_JavaScript 异步操作
异步操作 单线程模型 指的是,JavaScript 只在一个线程上运行 也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待 注意,JavaScript 只在一个线程上运 ...
- (59)Wangdao.com第十天_JavaScript 对象在 栈和堆
对象的属性值 如果要使用特殊的属性名,需 对象["属性名"] = 属性值 // 存 对象["属性名"] // 取 obj["1 ...
- (62)Wangdao.com第十天_JavaScript 变量的作用域
在 js 中有两种作用域:全局作用域,局部作用域. 全局作用域 直接写在 <script> 标签中的变量和方法. 在网页打开时创建,在网页关闭时销毁. 全局作用域有一个全局对象 windo ...
- (60)Wangdao.com第十天_JavaScript 函数_作用域_闭包_IIFE_回调函数_eval
函数 实现特定功能的 n 条语句封装体. 1. 创建一个函数对象 var myFunc = new Function(); // typeof myFunc 将会打印 function ...
- (61)Wangdao.com第十天_JavaScript 立即执行函数
1. 立即执行函数 创建完了就执行,只执行完就不再执行了. ( function(){} )(); 例 ( function(a,b){ alert("Hello ,我是一个匿名函数!&qu ...
- (64)Wangdao.com第十天_JavaScript 对象的 toString() 方法改变输出
JavaScript 对象的 toString() 方法改变输出 在平常,我们 console.log(对象); // 会打印 [Object Object] 但是我们想要更详细的输出,此时,我 ...
- (65)Wangdao.com第十天_JavaScript 垃圾回收机制 GC
垃圾积累过多,致使程序运行缓慢,什么是垃圾? 当堆中某个内容,再也没有指针指向它,我们将再也用不了它,此时就是一个垃圾. 出现这种情况是因为 obj = null; 此时,js 中的垃圾回收机制会自动 ...
- (86)Wangdao.com第十九天_JavaScript 接口之 ParentNode 和 ChildNode
ParentNode 接口,ChildNode 接口 节点对象除了继承 Node 接口以外,还会继承其他接口. ParentNode 接口 表示当前节点是一个父节点,提供一些处理子节点的方法. Chi ...
随机推荐
- Android应用程序国际化
前情提要 在Android应用程序中, 可以轻松更改语言, 以适应国际化标准 一些用户拥有多种语言习惯, 因此, 应用程序不能依赖设备默认语言环境, 必须提供更改显示语言的程序功能 本文章探寻持久化语 ...
- 动态规划dp
一.概念:动态规划dp:是一种分阶段求解决策问题的数学思想. 总结起来就一句话:大事化小,小事化了 二.例子 1.走台阶问题 F(10):10级台阶的走法数量 所以:F(10)=F(9)+F(8) F ...
- PHP循环语句深度理解分析——while, for, foreach, do while
循环结构 一.while循环 while(表达式) { 循环体;//反复执行,直到表达式为假 } 代码: $index = 1; while ($index<5) { ...
- 华为mate10 UA
Dalvik/2.1.0 (Linux; U; Android 9; ALP-AL00 Build/HUAWEIALP-AL00) "user-agent": "Mozi ...
- HTTP协议08-请求首部字段
请求首部字段 请求首部字段是从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息.客户端信息,对响应内容相关的优先级等内容 1)Accept 通知服务器,用户代理能够处理的媒体类型及媒 ...
- Lua中的迭代器与泛型for
[前言] 迭代器就是一种可以遍历一种集合中所有元素的机制,在Lua中,通常将迭代器表示为函数.每调用一次函数,就返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之后保存一些状态,这样才能知道 ...
- Apache JMeter压力测试实例
脚本录制 脚本录制,JMeter启用WEB代理,浏览器把代理上网设置为JMeter所在的IP地址,自己电脑就是127.0.0.1代理端口默认8080.至于浏览器修改代理上网服务器,不做截图. Jmet ...
- win10安装mysql5.7.20解压版
mysql安装包可到官网下载,地址:https://dev.mysql.com/downloads/mysql 1.首先解压文件包,我这解压到E:\install_work\mysql目录下: 2.发 ...
- 带问号的括号匹配问题918C 1153C
cf里好像经常出 这些题,一般贪心是搞不了的.. 918C 问有多少子段[l,r]满足合法括号 先从左往右扫,如果问号+‘(' 数量 >= ')' 说明这段区间的 ) 是满足条件的 然后再从右往 ...
- python内置模块之-logging
logging 模块主要用于写日志 logging模块主要有如下几个组件 Logger Logger对象提供应用程序可直接使用的接口 Handler Handler发送日志到适当的目的地 Filte ...