好程序员web前端教程之详解JavaScript严格模式,严格模式(Strict mode)是由ECMA-262规范定义的新兴JavaScript标准,发布于2009年12月第五版。旨在改善错误检查功能并且标识可能不会延续到未来JavaScript版本的脚本。ES5严格模式是限制性更强的JavaScript变体,它与常规JavaScript的语义不同,其分析更为严格。

  目前,除了IE6-9,其它浏览器均已支持ES5严格模式。

一、严格模式的使用

严格模式 的使用很简单,只有在代码首部加入字符串 “use strict”。有两种应用场景,一种是全局模式,一种是局部模式。

1)全局模式

'use strict'//code

2)局部模式

将”use strict”放到函数内的第一行,如下

function() {

"use strict";

//code}

二、严格模式下的执行限制

1)不使用var声明变量严格模式中将不通过

我们知道JS中,不使用var声明的变量默认转为全局变量。但在严格模式中将不允许,会报语法错误。

'use strict'g = 100 //错误

比如for循环

'use strict'for (i=0; i<5; i++) { //错误 console.log(i)}

2)任何使用’eval’的操作都会被禁止

'use strict'var obj = {}var eval = 3for (var eval in obj) {}function eval() {}function func(eval) {}

3)eval作用域 JS中作用域有两种,全局作用域和函数作用域。严格模式带来了第三种作用域:eval作用域,如下

'use strict'var a = 10eval('var a = 20; console.log(a)'); //20console.log(a) //10

4)with被禁用

'use strict'var obj = {

name:'zhangsan',

age:100,

sex:'男'}with(obj) { //报错 console.log(name);

console.log(age);

console.log(sex);}

5)caller/callee 被禁用

function func() {

'use strict'

arguments.callee

arguments.caller}func()

6)对禁止扩展的对象添加新属性会报错

'use strict'var obj = {}Object.preventExtensions(obj)obj.a = 1 // 报错

7)删除系统内置的属性会报错

'use strict'delete Object.prototype // 报错delete Function.prototype // 报错

8)delete使用var声明的变量或挂在window上的变量报错

'use strict'var obj = {a:1}window.a = 1delete obj // 报错delete a // 报错

9)delete不可删除属性(isSealed或isFrozen)的对象时报错

'use strict'var obj = {a: 1}Object.seal(obj)delete obj.a //报错

10)对一个对象的只读属性进行赋值将报错

'use strict'var obj = {}Object.defineProperty(obj, 'a', {value: 1, writable: false})obj.a = 2 // 报错

11)函数有重名的参数将报错

'use strict'function func(a, a) {

alert(a)}func()

而在非严格模式中,后面的同名参数将覆盖前面的。

12)八进制表示法被禁用

'use strict'var num = 022

13)arguments严格定义为参数,不再与形参绑定

function func(a) {

arguments[0] = 2

alert(a) // 2} func(1)

func调用时传参为1,函数内部通过arguments修改为2,此时alert的为修改后的2。 而在严格模式中则不能被修改,如下

'use strict'function func(a) {

arguments[0] = 2

alert(a) // 1} func(1)

14)函数必须声明在顶层

我们知道函数声明和函数表达式是两个不同的概念。一般函数声明都在最顶层,ES5前的JS宽松,你可以写在if或for内。当然Firefox的解析方式与其他浏览器不同,见SJ9002。而在严格模式中这些写法将直接报错

'use strict'if (true) {

function func1() { } // 语法错误}for (var i = 0; i < 5; i++) {

function func2() { } // 语法错误}

15)ES5里新增的关键字不能当做变量标示符使用,如implements, interface, let, package, private, protected, public, static, yield

'use strict'var let = 10 //报错var yield = 20

16)call/apply的第一个参数直接传入不包装为对象

'use strict'function func() {

console.log(typeof this)}func.call('abcd') // stringfunc.apply(1) // number

依次为”string”,”number”。而在非严格模式中call/apply将对值类型的”abcd”,1包装为对象后传入,即两次输出都为”object”。

17)call/apply的第一个参数为null/undefined时,this为null/undefined 这里以call来示例

'use strict'function func() {

console.log(this)}func.call(undefined) // undefinedfunc.call(null) // null

依次是undefined,null。而非严格模式中则是宿主对象,浏览器里是window,node.js环境则是global。

18)bind的第一个参数为null/undefined时,this为null/undefined bind是ES5给Function.prototype新增的一个方法,它和call/apply一样在function上直接调用。它返回一个指定了上下文和参数的函数。当它的第一个参数为null/undefined时,情形和call/apply一样,this也为null/undefined。

'use strict'function func() {

console.log(this)}var f1 = func.bind(null)var f2 = func.bind(undefined)f1() // nullf2() // undefined

而在非严格模式中输出的都是window(或global)。

“use strict” 的位置必须在首部。首部指其前面没有任何有效js代码。以下都是无效的,将不会触发严格模式。

a)“use strict” 前有代码, 无效

var width = 10'use strict' g = 100

b)“use strict” 前有个空语句,无效

;//这里是空语句'use strict' g = 100

function func() {

;

'use strict'

g = 200}

function func() {

;'use strict'

localVar = 200}

当然,“use strict”前加注释是可以的

// strict mode'use strict'g = 100

function func() {

// strict mode 'use strict'

g = 200}func()

window 程序报错 自动重启_好程序员web前端教程之详解JavaScript严格模式相关推荐

  1. 前后端解析_好程序员Web前端教程分享前后端分离接口

    随着互联网的高速发展以及IT开发技术的升级,前后端分离已成为互联网项目开发的业界标准使用方式.在实际工作中,前后端的接口联调对接工作量占Web前端人员日常工作的30%-50%,甚至会更高.接下来的好程 ...

  2. vue如何获取年月日_好程序员web前端教程分享Vue相关面试题

    好程序员web前端教程分享Vue相关面试题,Vue是一套构建用户界面的渐进式框架,具有简单易用.性能好.前后端分离等优势,是web前端工程师工作的好帮手,也是企业选拔人才时考察的重点技能.接下来好程序 ...

  3. 引入js_好程序员web前端教程分享js中的模块化一

    好程序员web前端教程分享js中的模块化一:我们知道最常见的模块化方案有CommonJS.AMD.CMD.ES6,AMD规范一般用于浏览器,异步的,因为模块加载是异步的,js解释是同步的,所以有时候导 ...

  4. 好程序员web前端教程分享js中的模块化一

    好程序员web前端教程分享js中的模块化一:我们知道最常见的模块化方案有CommonJS.AMD.CMD.ES6,AMD规范一般用于浏览器,异步的,因为模块加载是异步的,js解释是同步的,所以有时候导 ...

  5. 好程序员Web前端教程分享Vue学习心得

    为什么80%的码农都做不了架构师?>>>    好程序员Web前端教程分享Vue学习心得,Vue是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向 ...

  6. js怎么定义combobox_好程序员web前端教程分享新手应该怎么学习webpack

    好程序员web前端教程分享新手应该怎么学习webpack,什么是webpack?一句话概括:webpack是一个模块打包工具(module bundler).重点在于两个关键词"模块&quo ...

  7. 好程序员Web前端教程分享JavaScript开发技巧

    好程序员Web前端教程分享JavaScript开发技巧,相信知道Web前端的小伙伴都熟悉,Javascript的很多扩展的特性是的它变得更加的犀利,同时也给予程序员机会创建更漂亮并且更让用户喜欢的网站 ...

  8. 好程序员web前端教程分享网页设计需要学那些东西?

    好程序员web前端教程分享网页设计需要学那些东西:初次接触或者想要进入网页设计行业的朋友会经常分不清楚web前端与网页设计之间的区别,不知道网页设计要学什么,web前端要学什么,因此感到很迷茫,下面老 ...

  9. 好程序员web前端教程分享JavaScript验证API

    好程序员web前端教程分享JavaScript验证API,小编每天会分享一下干货给大家.那么今天说道的就是web前端培训课程中的章节. JavaScript验证API 约束验证DOM方法 Proper ...

最新文章

  1. 设计模式 — 创建型模式 — 原型模式
  2. Windows 10 配置系统环境变量
  3. 广东 职称英语计算机,现在评职称英语和计算机都不用考了
  4. BZOJ2646 : neerc2011 flight
  5. opencv-api getStructuringElement
  6. python传递utf8 到c++_深入理解Python的TLS机制和Threading.local()
  7. ln命令:软链接建立与删除
  8. linux 多线程学习
  9. 软件测试成熟度与自动化测试
  10. 大智慧c语言dll,调用大智慧dll,简单支持大智慧公式dll接口
  11. Windows10安装JDK配置环境变量
  12. python三阶魔方_三阶魔方7步还原法详解 简单
  13. ArangoDB教程(二)-AQL语句使用,图使用,结合WEB界面端
  14. windows删除注册表(通用方法)
  15. python搬运youtube视频_使用Python将YouTube视频下载到某个目录
  16. 17个你必须牢记的Win7快捷键
  17. 利用asp.net Core开发webapi对接云之家智能审批数据互联控件
  18. cannot find -lxxx问题
  19. Learning to See in the Dark
  20. CDA Level1知识点总结之总论

热门文章

  1. 标准SQL的update语句三种用法
  2. 以电商网站为例,谈大型分布式架构设计与优化
  3. IBatis 简易框架搭建
  4. C#代码规范 .NET程序员需要提升的修养
  5. java足球经理2010下载_apk是什么文件?apk文件怎么打开?
  6. Java IOUtils.copy方法代码示例(亲测)
  7. CentOS 7/8 安装 oniguruma 和 oniguruma-devel
  8. php 7.1/7.3使用 json_encode 函数造成浮点类型数据出现精度问题
  9. 解决MySQL事务未提交导致死锁报错 避免死锁的方法
  10. svn命令行工具安装使用(windows)