前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >严格模式use strict

严格模式use strict

作者头像
wade
发布2020-04-24 17:16:27
9250
发布2020-04-24 17:16:27
举报
文章被收录于专栏:coding个人笔记coding个人笔记

JavaScript是一个弱类型语言,这其实跟JavaScript创建之初有关系。当时JavaScript的作者只是随便写一个语言来临时使用,鬼知道JavaScript会在今天这么有地位。

有业界大牛说JavaScript是现在开发语言里面最差的,不可否认,越是约束少的语言,真正面对大型项目的时候越是容易出现问题。其实JavaScript有很多不合理不严谨甚至是糟糕的机制。比如没有作用域、重复声明变量、可选的分号等等,都是被人诟病地方。

随着JavaScript应用的越来越多,ECMAScript慢慢的也定制了一些标准来改进JavaScript的缺陷,比如ES6的let、const、module、class等。而早在ES5就提出了第二种运行模式严格模式,就是希望开发者能慢慢的脱离马虎模式/稀松模式/懒散模式(sloppy)模式。

严格模式的目的:

消除JavaScript语法不合理不严谨的地方,减少奇怪的行为。

消除代码运行不安全的地方。

提高编译效率和运行速度。

为未来做铺垫。

严格模式IE10以上和各大浏览器都已经支持,要注意的是,相同代码在严格模式和非严格模式下运行得到的结果会有不同。主要还是增加了很多静默是吧抛出异常。

使用:"use strict"

可以在整个js开头声明,也可以在函数里面声明:

代码语言:javascript
复制
<script> 
 "use strict";
</script>

或者:

代码语言:javascript
复制
function fn() { 
  "use strict";
}

严格模式下的改进:

没有声明a,直接a = 10报错,这意味着拼写错误的变量直接报错。

对只读属性、getter属性赋值,对禁止扩展的对象添加新属性,删除不可删除的属性都会抛出异常。

对象有重名属性、函数参数重名,正常是后面覆盖之前的,严格模式下是语法错误、会报错。

禁止了八进制表示法

ECMAScript 6中的严格模式禁止设置primitive值的属性.不采用严格模式,设置属性将会简单忽略(no-op),采用严格模式,将抛出TypeError错误。这个我还真不理解。

严格模式简化了代码中变量名字映射到变量定义的方式,JavaScript有些情况会使得代码中名字到变量定义的基本映射只在运行时才产生. 严格模式移除了大多数这种情况的发生, 所以编译器可以更好的优化严格模式的代码:

禁止使用with:

with所引起的问题是块内的任何名称可以映射(map)到with传进来的对象的属性, 也可以映射到包围这个块的作用域内的变量(甚至是全局变量), 这一切都是在运行时决定的: 在代码运行之前是无法得知的。

创建eval作用域:

在正常模式下, 代码 eval("var x;") 会给上层函数或者全局引入一个新的变量 x 。这意味着, 一般情况下, 在一个包含 eval 调用的函数内所有没有引用到参数或者局部变量的名称都必须在运行时才能被映射到特定的定义 (因为 eval 可能引入的新变量会覆盖它的外层变量)。在严格模式下 eval 仅仅为被运行的代码创建变量, 所以 eval 不会使得名称映射到外部变量或者其他局部变量。

无法删除变量。只有configurable设置为true的对象属性,才能被删除。

代码语言:javascript
复制
var a = 10;
delete a;//报错

严格模式下更容易写出“安全”的JavaScript

禁止this执行全局对象:

代码语言:javascript
复制
function fn() { 
  "use strict"; 
  console.log(this);}
fn()//undefinednew fn()指向window

禁止函数内部遍历调用栈:

代码语言:javascript
复制
function fn() { 
  "use strict"; 
  console.log(fn.arguments);
console.log(fn.caller);
}
fn()//报错

Arguments不能赋值,也不会追踪参数变化:

代码语言:javascript
复制
function fn(a) { 
  a = 20; 
  console.log(arguments[0]);
}
fn(10)

严格模式输出10,非严格模式输出20。

严格模式下的arguments不会再提供访问与调用这个函数相关的变量的途径,也就是禁用arguments.callee

函数声明必须在顶层,也就是说只能在全局或者函数作用域内声明函数,在if或者for循环里面不能声明函数,否则报错。

为未来的ECMAScript版本铺平道路,增加了一些保留字,也就是不能用来声明变量的关键字,不能再用这些名字作为变量名或者形参名:

implements, interface, let, package, private, protected, public, static, yield,class, enum, export, extends, import, super等

(完)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 coding个人笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档