概述

严格模式是什么

严格模式是JavaScript中的一种限制性更强的变种方式。严格模式不是一个子集:它在语义上与正常代码有着明显的差异。
不支持严格模式的浏览器与支持严格模式的浏览器行为上也不一样,所以不要在未经严格模式特性测试情况下使用严格模式。
严格模式可以与非严格模式共存,所以脚本可以逐渐的选择加入严格模式。

严格模式的目的

首先严格模式会将JavaScript陷阱直接变成明显的错误。
其次就是严格模式修正了一些引擎以优化的错误:同样的代码有时候严格模式会比非严格模式下更加流畅。
然后,严格模式禁用了一些有可能在未来版本中定义的语法。

开启严格模式

全局开启严格模式

如果想要在JavaScript中开启严格模式,首先要在所有代码的最前面,定义一个不会赋给任何变量的字符串。
如果之前的JavaScript代码是非严格模式的话,建议不要盲目的为这段代码开启严格模式,这样可能会出现问题。在初学时期建议按一个个的函数去开启严格模式。

// 开启严格模式 - 作用于全局作用域
// "use strict"
// 定义一个变量 - 不使用var关键字
a = 100;
//在非严格模式中可以不使用var关键字,但是严格模式不可以,不然就会报错。
console.log(a);function fn(){// 开启严格模式 - 作用于函数作用域"use strict"v = 200;console.log(v);
}
fn();

函数开启严格模式

严格模式也可以为一个指定的函数开启。

function fn(){'use strict'//在函数体中开启严格模式,但是函数意外依旧是非严格模式v = 200;consolo.log(v);
}
fn();

变量

禁止意外创建变量

在严格模式的情况下,是不允许创建全局变量的。

// 开启严格模式
"use strict";v = 100;//不使用var关键字
console.log(v);function fn(){// 在非严格模式:在函数作用域中定义变量 - 不使用var关键字 -> 自动将其提升为全局变量w = 200;console.log(w);
}
fn();
console.log(w);

静默失败转为异常

所谓的静默失败就是即不报错也没有任何效果。例如改变常量的值。在严格模式下,静默失败会转换成抛出异常。

// 开启严格模式
"use strict";const v = 3.14;// 定义常量
v = 1.14;// 重新赋值。严格模式下结果报错。console.log(v);

禁用delete关键字

在严格模式下,不能使用变量使用delete运算符,但是这种情况只针对变量,对数组和对象属性没有限制。

// 开启严格模式
"use strict";
// 严格模式下禁用delete关键字 -> 针对删除变量,而不是数组元素和对象属性// var v = 100;// 定义一个全局变量
// console.log(v);
//
// delete v;// 删除全局变量v
// console.log(v);// undefined
定义数组
// var arr = [1,2,3,4,5];
// delete arr[0];
// console.log(arr);
定义对象
var obj = {name : '张无忌'
}
delete obj.name;
console.log(obj.name);

对变量名的限制

在严格模式下,JavaScript对变量名也有限制。特别不能使用如下内容作为变量:

上述内容都是保留字,在ECMAScript的下一个版本中可能会用到他们。
但是在严格模式下,使用上述标示符作为变量名会导致语法错误。

// 开启严格模式
"use strict";var static = 100;
console.log(static);//结果-报错

对象

不可删除的属性

在严格模式下,不能使用delete运算符删除不可删除的属性。

 开启严格模式
"use strict";
//在非严格模式下使用delete删除不可删除的属性delete Object.prototype;//结果会静默失败console.log(Object.prototype);//在严格模式下使用delete删除不可删除额属性,结果就是抛出异常。
delete Math.random;
console.log(Math.random);
// Math.random();

属性名必须唯一

在严格模式下,一个对象的所有属性名在对象内必须唯一。

// 开启严格模式
"use strict";//在非严格模式下重名是允许的,最后一个重名的属性就会覆盖以上的属性
//当开启严格模式,重名属性就会被认为是语法错误
var obj = {name : '张三',name : '李四'
}
console.log(obj.name);

只读属性的赋值

在严格模式下,不能为一个只读的属性进行重新赋值。

// 开启严格模式
"use strict";var obj = {name : '张无忌'
}
// 用于判断指定属性是否为只读属性
var result = Object.getOwnPropertyDescriptor(obj, 'name');
console.log(result);//在非严格模式下为只读属性重新赋值,结果会为静默失败。
// 定义对象obj的只读属性
Object.defineProperty(obj, 'age', {value : 18
});
// 针对只读属性进行修改操作
// obj.age = 80;
// console.log(obj.age);delete obj.age;
console.log(obj.age);

不可扩展的对象

在严格模式下,不能为不可扩展的对象添加新属性。

// 开启严格模式
"use strict";var obj = {};
// 设置对象obj是一个不可扩展的对象
Object.preventExtensions(obj);// 为对象obj新增属性
obj.name = '张无忌';
console.log(obj);
//在非严格模式下为不可扩展的对象添加新属性,结果是静默失败。

函数

参数名必须唯一

在严格模式下,要求命名函数的参数必须唯一。

// 开启严格模式
"use strict";function fn(a, a, b){console.log(a + a + b);
//在非严格模式下最后一个参数名就会之前的重名参数,之前的参数仍然可以铜鼓arguments[i]来访问。
//在开启严格模式下,重名参数就会被认为是语法错误。
}
fn(1,2,3);

arguments的不同

在严格模式下,arguments对象的行为也有所不同。
1.在非严格模式下,修改命名参数的值也会反应到arguments对象中。
2.在严格模式下,命名参数与arguments对象是完全独立的。

// 开启严格模式
"use strict";function fn(value){var value = '张无忌';console.log(value);// 张无忌 -> 就近原则/** 非严格模式下 - arguments对象获取参数的值与形参有关的* 如果局部变量与形参名相同 - 根据就近原则进行获取* 严格模式下 - arguments对象获取参数的值与形参无关的*/console.log(arguments[0]);// 张无忌
}
fn('周芷若');

arguments.callee()

在严格模式下,不能使用arguments对象的callee()方法。

// 开启严格模式
"use strict";
//在非严格模式下,arguments对象callee()方法,表示调用函数本身
// 在严格模式下,arguments对象无法调用callee()方法,结果抛出异常
function fn(){console.log(arguments.length);// return arguments.callee;
}
fn();

函数声明的限制

在严格模式下,只能在全局域和函数域中声明函数。

// 开启严格模式
"use strict";// 在全局作用域
function fn(){// 在函数作用域function n(){}//在非严格模式下,函数的定义在人格位置声明函数都是可以的。
}
// 在严格模式下,函数的定义只能在全局作用域与函数作用域(不能在块级作用域定义函数),语法错误
for (var i=0; i<10; i++) {// ECMAScript 6新增 - 存在着块级作用域var v = 100;function f(){console.log('this is function');}
}
console.log(v);
f();

eval()函数

增加eval()作用域

在严格模式下使用eval()函数创建的变量只能在eval()函数内部使用。

// 开启严格模式
"use strict";
//在非严格模式下eval()函数创建的变量在其他位置可以使用。
// 在严格模式下,增加eval作用域 - eval()函数定义的变量只能在当前eval()函数内部使用
eval('var v = 100;');
// 在全局作用域中调用变量 - 报错
console.log(v);// 100

arguments对象

禁止读写

在严格模式下,禁止使用eval()和arguments作为标示符,也不允许读写它们的值。
1.使用var声明
2.赋值另一个值
3.尝试修改包含的值
4.用作函数名
5.用作命名的函数的参数
6.在try...catch语句中用作例外明

// 开启严格模式
"use strict";
//在严格模式下,以下所有尝试都导致语法错误
eval = 17;
arguments++;
++eval;
var obj = { set p(arguments) { } };
var eval;
try { } catch (arguments) { }
function x(eval) { }
function arguments() { }
var y = function eval() { };
var f = new Function("arguments", "'use strict'; return 17;");

this关键字

抑制this

在非严格模式下使用函数的apply()或call()方法时,null或undefined值会被转换为全局对象。
在严格模式下,函数的this值始终是指定的值(无论什么值)。

// 开启严格模式
"use strict";var v = 100;function fn(){console.log(this.v);
}var obj = {v : 200
}fn.call(obj);// this指向全局对象

JavaScript面向对象中的严格模式相关推荐

  1. javascript 面向对象编程(工厂模式、构造函数模式、原型模式)

    javascript 面向对象编程(工厂模式.构造函数模式.原型模式) CreateTime--2018年3月29日17:09:38 Author:Marydon 一.工厂模式 /*** 工厂模式*/ ...

  2. Javascript 面向对象中的构造函数和原型对象

    先解释下原型.每一个Javascript对象(null除外)都和另外一个对象相关联,这个"另外一个对象"就是我们熟知的原型, 每一个对象都从原型继承属性和行为(方法). var a ...

  3. JavaScript面向对象之构造函数

    下面是对JavaScript面向对象中构造函数的整理,希望可以帮助到有需要的小伙伴 JavaScript面向对象之构造函数 构造函数可以帮你构造出你喜欢的任何一个对象,给构造函数属性和方法,构造函数都 ...

  4. javascript面向对象思想

    javascript中的面向对象思想 面向对象 Java编程中万物皆对象,即所有为外界提供属性和方法的整体都可以看做对象,而在面向对象编程中,我们只关注对象提供的属性和方法,而不关注对象本身,所以把代 ...

  5. javascript 在对象中使用 定时器_如何使用JavaScript 面向对象编程

    学习目标 理解面向对象开发思想 掌握 JavaScript 面向对象开发相关模式 面向对象介绍 什么是对象 Everything is object (一切皆对象) 我们可以从两个层次来理解对象: ( ...

  6. JavaScript 面向对象编程(三) —— 函数进阶 / 严格模式 / 高阶函数 / 闭包 / 浅拷贝和深拷贝

    本篇为 JavaScript 进阶 ES6 系列笔记第三篇,将陆续更新后续内容.参考:JavaScript 进阶面向对象 ES6 :ECMAScript 6 入门 系列笔记: JavaScript 面 ...

  7. JavaScript中OOP——面向对象中的继承/闭包

      前  言  OOP  JavaScript中OOP-->>>面向对象中的继承/闭包 1.1面向对象的概念 使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方法.      ...

  8. JavaScript中的的面向对象中的一些知识

    JavaScript中的的面向对象中的一些知识 function Cat(name,age){return {name:name,age:age }}//构造函数function Dog(name,a ...

  9. JavaScript中使Promise模式进行异步编程

    Promises 其中的一种模式就是promise,它代表了一种潜在地.长时间运行但不必返回完成操作的结果.与阻塞并长时间等待运行计算完成不同,这种模式返回一个代表承诺(promised)结果的对象. ...

最新文章

  1. MySQL GROUP BY:分组查询
  2. python做excel数据分析统计服_Python也能做到Excel那样,条件统计轻松解决工作需求...
  3. Android之OKHttp使用总结
  4. 工业机器人用铸铁牌号_蠕墨铸铁生产工艺
  5. Bootstrap3 地址元素样式
  6. python接口自动化(二十八)--html测试 报告——下(详解)
  7. csdn图片排版技巧
  8. windos读写ext3工具_“ ext2fsd” Windows系统工具,用于读写ext2 / 3/4文件系统
  9. warning: Pulling without specifying how to reconcile divergent branches is discouraged. You can sque
  10. html 实现b站弹幕,可实现B站 蒙版弹幕 效果的前端组件 —— Barrage UI
  11. UE4 利用WEBUI插件完成UE与JS的交互 (UE4嵌入WEB)
  12. 微信小程序搜索wifi列表
  13. 腾讯课堂 H5 直播间点赞动效实现
  14. Java 安全-JNDI注入学习
  15. mico3165嵌入式开发板IAR环境搭建以及Demo运行
  16. ACL占用TCAM情况测试
  17. Android鹰眼轨迹追踪
  18. 机器人学:齐次变换矩阵
  19. 为什么我发的视频播放量老涨不上去?
  20. 反向迭代器reverse_iterator模拟实现

热门文章

  1. 移动端调试 weinre
  2. 我们希望读者能从这个BLOG获得什么?
  3. 理解JavaScript原型链
  4. 64位虚拟机安装64位ubuntu出现问题
  5. SQL语句调优 - 索引上的数据检索方法
  6. Android中Alertdialog对话框点击消失?
  7. 曾今的代码系列——获取当天最大流水号存储过程
  8. 历届 SIGGRAPH 上有什么新奇、有趣的项目?
  9. GitLab安装后修改IP/域名
  10. [caffe] 数据制作和训练