JS在严格模式和非严格模式的区别
若想在严格模式下使用JS,需要在文件的第一行加上“use strict”,在实际开发中,常常将“use strict”加入到闭包的内部
具体是:
整个脚本中使用:在这个JavaScript文件开头写'use strict'; 在闭包内部中使用
funtion () {
'use strict';
}
- 严格模式下,不允许使用with
 
with语句 扩展一个语句的作用域链。
with (expression) {
statement
}
- 严格模式下,不允许给未声明的变量赋值
 - 严格模式下,arguments与参数不存在映射关系
 
function(h) {
    arguments[0] = 100;
    console.log(h);  //100
}(1);
function(h) {
    'use strict';
    arguments[0] = 100;
    console.log(h);  //1
}(1);
但是,但参数是对象时,是存在映射关系的:
function(h) {
    'use strict';
console.log(h.a);//1
    arguments[0].a = 100;
    console.log(h.a);  //100
}({a:1});
严格模式下,删除参数名,函数名报错。非严格模式返回false,不报错也没有任何效果
function(h) {
    console.log(h);  //1
    console.log(delete h);  //false
    console.log(a);  //1
}(1);
function(h) {
    'use strict';
    console.log(h);  //1
    delete h;  //SyntaxError(语法错误)
    console.log(h);  //1
}(1)
严格模式下,函数参数名重复报错。非严格模式最后一个重名参数会覆盖之前的重名参数。
function (a, a, b) {
    console.log(a + b);  //5
}(1, 2, 3);
!function (a, a, b) {
    'use strict';
    console.log(a + b);  //SyntaxError
}(1, 2, 3);
严格模式下,删除不可配置(configurable=false)的属性报错。非严格模式返回false,不报错也没有任何效果
function (a){
    var obj={};
    Object.defineProperty(obj,'a',{ configurable: false });
    console.log(delete obj.a); //flase
}(1);  
!function (a){
    'use strict';
    var obj={};
    Object.defineProperty(obj, 'a', { configurable: false });
    console.log(delete obj.a); //TypeError
}(1);
- 严格模式下,修改不可写(writable=false)的属性报错
 
unction () {
    var obj = { a: 1 };
    Object.defineProperty(obj, 'a', { writable: false });
    obj.a = 2;
    console.log(obj.a);  //1  //证明没有被修改
}();
!function () {
    'use strict';
    var obj = { a: 1 };
    Object.defineProperty(obj, 'a', {writable: false});
    obj.a = 2;  //TypeError
}();
严格模式下,一般函数调用,this指向undefined,而不是全局对象。
function () {
    function fun() { return this; }
    console.log( fun() );  //Window
}();
!function () {
    'use strict';
    function fun() { return this; }
    console.log( fun() );  //undefined
}();
严格模式下,不再支持arguments.callee/caller。
JS在严格模式和非严格模式的区别的更多相关文章
- JS严格模式和非严格模式的区别
		
严格模式和非严格模式的区别 //f1.js 'use strice'; //整个js文件都是严格模式下执行的 var n = 1; var foo = function(){...}; //... v ...
 - JS-严格模式、非严格模式
		
2018年11月14日晚上,我在“深入理解javascript”书上第一次知道“严格模式”“非严格模式”这2个名词: “严格模式”使用指令:“use strict”: 这个指令我其实有经常看到,在其他 ...
 - socket异步通信-如何设置成非阻塞模式、非阻塞模式下判断connect成功(失败)、判断recv/recvfrom成功(失败)、判断send/sendto
		
socket异步通信-如何设置成非阻塞模式.非阻塞模式下判断connect成功(失败).判断recv/recvfrom成功(失败).判断send/sendto 博客分类: Linux Socket s ...
 - XCode工程中ARC模式与非ARC模式共用(转)
		
Xcode 项目中经常会融合一些老的代码,它们可能采用非ARC的模式.混合编译时,就会碰到编译出错的情况. 如何共用ARC模式和非ARC模式呢? XCode除了提供整个项目是否使用ARC模式的选择外, ...
 - oracle11g设置归档模式和非归档模式
		
1.首先查看当前数据库是否处于归档模式 可使用如下两种方式查看 1.1 select name, log_mode from v$database; log_mode的值为 ...
 - Oracle之归档模式与非归档模式
		
归档模式和非归档模式 在DBA部署数据库之初,必须要做出的最重要决定之一就是选择归档模式(ARCHIVELOG)或者非 归档模式(NOARCHIVELOG )下运行数据库.我们知道,Oracle 数据 ...
 - Oracle归档模式和非归档模式的区别
		
一.查看oracle数据库是否为归档模式: Sql代码1.select name,log_mode from v$database; NAME LOG_MODE ------------------ ...
 - Oracle归档模式与非归档模式设置
		
(转自:http://www.cnblogs.com/spatial/archive/2009/08/01/1536429.html) Oracle的日志归档模式可以有效的防止instance和dis ...
 - 怎样将Oracle数据库设置为归档模式及非归档模式
		
怎样将Oracle数据库设置为归档模式及非归档模式 1.Oracle日志分类 分三大类: Alert log files--警报日志,Trace files--跟踪日志(用户和进程)和 redo lo ...
 - MySQL MHA--故障切换模式(GTID模式和非GTID模式)
		
GTID和非GTID故障切换模式选择 MySQL 5.6版本引入GTID来解决主从切换时BINLOG位置点难定位的问题,MHA从0.56版本开始支持基于GTID的复制,在切换时可以采用GTID模式和非 ...
 
随机推荐
- scrapy工作原理概述
			
当运行scrapy crawl spider 时,会生成一个crawl命令对象,scrapy是调用execute函数(cmdlin.py)来执行命令的,execute函数会给命令对象添加crawler ...
 - react-native 安卓支持 gif动态图
			
需要在android/app/build.gradle文件中添加模块 //这一行没有的话得加上才行 compile "com.facebook.fresco:fresco:1.5.0&quo ...
 - 20165304《Java程序设计》第七周学习总结
			
教材学习内容总结 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系统,简称MySQL,是世界上最流行的开源数据库管理系统,其社区版(MySQL Community ...
 - addEventListener 的事件冒泡
			
语法 target.addEventListener(type, listener, useCapture); target 文档节点.document.window 或 XMLHttpRequest ...
 - text-align: justify;浏览器、安卓手机不兼容问题
			
https://segmentfault.com/a/1190000013146385
 - ubuntu 安装 oracle sql developer
			
安装java-jdk 这一部分教程很多,可按照网上教程进行安装 安装sqldeveloper 下载 sqldeveloper Linux RPM http://www.oracle.com/techn ...
 - openresty(完整版)Lua拦截请求与响应信息日志收集及基于cjson和redis动态路径以及Prometheus监控(转)
			
直接上文件 nginx.conf #运行用户和组,缺省为nobody,若改为别的用户和组,则需要先创建用户和组 #user wls81 wls; #开启进程数,一般与CPU核数等同 worker_pr ...
 - Delphi中TApplication详解(转仅供自己参考)
			
转自:http://blog.sina.com.cn/s/blog_4d6f55d90100bmv9.html TApplication是用于Delphi应用程序的类型,该类在单元forms中声明.T ...
 - Win7下npm命令Error: ENOENT问题解决
			
Win7下在执行npm命令,比如npm list时出现下面错误:
 - 发现一个好办法-有问题可以到UNITY论坛搜索
			
特别专业的问题,较新技术,可以到UNITY论坛搜索或发问,那里,或许会有UNITY的官方技术支持回答 https://forum.unity.com/threads/remote-deep-profi ...