专栏首页coding个人笔记严格模式use strict

严格模式use strict

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

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

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

严格模式的目的:

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

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

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

为未来做铺垫。

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

使用:"use strict"

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

<script> 
 "use strict";
</script>

或者:

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的对象属性,才能被删除。

var a = 10;
delete a;//报错

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

禁止this执行全局对象:

function fn() { 
  "use strict"; 
  console.log(this);}
fn()//undefinednew fn()指向window

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

function fn() { 
  "use strict"; 
  console.log(fn.arguments);
console.log(fn.caller);
}
fn()//报错

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

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等

(完)

本文分享自微信公众号 - coding个人笔记(gh_2ce38b49dae1),作者:wade

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Vuex之mutation

    我们已经可以在组建中使用store里面的数据了,那么我们要怎么修改这个数据呢?vuex提供了mutation,官网上说:

    wade
  • JavaScript设计模式

    设计模式是什么?设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

    wade
  • JavaScript之调用栈

    很早之前写过栈和堆的结构,非常简单的介绍了一下,主要是为了明白深拷贝和浅拷贝。最近突然发现了调用栈这个概念,理解这个概念对于一些函数的执行能更清晰的理解,比如递...

    wade
  • [梁山好汉说IT] 区块链在梁山的应用

    但是李逵这厮赌品不好,石秀容易上头,杨志容易犯二,刘唐既容易上头还容易犯二,白胜容易被欺负,乐和 / 小乙哥容易耍手段出老千。

    罗西的思考
  • 移动僵尸网络检测:一种使用卷积神经网络的深度学习方法(CS CS)

    Android作为最广泛的移动操作系统,正日益成为恶意软件的攻击目标。旨在将移动设备转变为可能构成更大僵尸网络一部分的僵尸程序的恶意应用程序已经非常普遍,因此构...

    刘子蔚
  • 一文读懂卷积神经网络CNN

    来源:机器学习算法与自然语言处理 作者:白雪峰 本文为图文结合,建议阅读10分钟。 本文为大家解读如何简单明了的解释卷积,并且分享了学习中的一些方法案例。 首先...

    企鹅号小编
  • 一文读懂卷积神经网络CNN(学习笔记)

    来源:机器学习算法与自然语言处理 作者:白雪峰 本文为图文结合,建议阅读10分钟。 本文为大家解读如何简单明了的解释卷积,并且分享了学习中的一些方法案例。 首...

    数据派THU
  • 《你不知道的JavaScript》:this 绑定规则的优先级

    前面两篇讲了this的调用位置影响和绑定规则,在一般情况下想要弄清this的指向,只需找到函数的调用位置和并判断应当应用哪条绑定规则即可。但有时会出现某个调用位...

    前端_AWhile
  • 前端读书路线图:从入门到编写框架

    某天,我在阅读《JavaScript 框架设计:第 2 版》的时候,发现我在 2015 年画的读书路线系列中的前端篇,被收录到其中。

    Phodal
  • 学界 | 普适注意力:用于机器翻译的2D卷积神经网络,显著优于编码器-解码器架构

    深度神经网络对自然语言处理技术造成了深远的影响,尤其是机器翻译(Blunsom, 2013; Sutskever et al., 2014; Cho et al...

    机器之心

扫码关注云+社区

领取腾讯云代金券