严格模式

严格模式是JavaScript中的一种限制性更强的变种方式

严格模式可以跟非严格模式共存

目的

首先,在严格模式中将JavaScript陷阱直接报错

其次,修正了一些引擎难以优化的错误:同样的代码在严格模式下更快

最后,严格模式禁用了一些有可能在为来版本中定义的语法

全局开启严格模式

在要进行严格模式的代码前加上

"use strict"
// "use strict"; //全局开启严格模式 会在全局跟局部都有效
// v = 100;
// console.log(v);function fn(){"use strict";//局部开启严格模式 会在局部都有效v = 300;console.log(v);
}
fn();

禁止意外创建变量

"use strict";
v = 100;
console.log(v);function fn(){w = 200;//非严格模式下 函数中不用var 定义变量 会自动声明在全局中    //但用严格模式会直接报错 强制让你改掉console.log(w);
}
fn();

静默失败转为异常

"use strict";const PI = 3.14;
var PI = 1.14;//不开启严格模式 有的标准版可能会报错 原因是因为他在视图改变常量 但是开启严格模式一定会报错console.log(PI);

禁用delete关键字

只针对删除变量的delete

"use strict";
var v = 100;
console.log(v);//delete v;//没有开启严格模式时 本意为删除全局变量V 但结果没删除 这是一种静默失败
//开启严格模式时 直接报错 不允许用delete删除变量
//报错信息:Delete of an unqualified identifier in strict mode.
console.log(v); var arr = [1,2,3,4];
delete arr[1];//开启严格模式时 允许用delete删除数组元素
console.log(arr)var obj = {name:'chen',
}
delete obj.name;  //开启严格模式时 允许用delete删除对象的属性
console.log(obj.name);

对变量名的限制

严格模式下对变量名有更高的限制 比如:implements interface let package

private protected public static yield等

出现这些变量名会直接报错 报错信息:Unexpected strict mode reserved word

"use strict";
var static = 100;
console.log(static);

不可删除的属性

"use strict";
delete Object.prototype;//没开启严格模式 也删除不了 但是不会报错 这也是静默失败
//严格模式下 会直接报错
//报错信息:Cannot delete property 'prototype' of function Object() { [native code] }
console.log(Object.prototype);delete Math.random;//非严格模式和严格模式都可以删除
Math.random();

属性名必须唯一

严格模式下,一个对象内重复出现多个重复的属性名

"use strict";
var obj = {name : 'chen',name : 'cheng'//非严格模式第二个同名的有效//严格模式 也能用 但有编译器可能出现编辑器报错 属于警告作用
}
console.log(obj.name);

只读属性的赋值

"use strict";
var obj = {name : 'chen'
}
var result = Object.getOwnPropertyDescriptor(obj,'name');
console.log(result);Object.defineProperty(obj,'age',{value:18
});//用defineProperty方式创建的对象默认不可修改 不可遍历 不可删除
obj.age = 80;//非严格模式下 修改等操作不可用 但不报错 静默失败
//严格模式下 修改等操作不可用  直接报错
//报错信息:Cannot assign to read only property 'age' of object '#<Object>'
console.log(obj.age);

不可扩展的对象

"use strict";
var obj = {}
Object.preventExtensions(obj);//这个函数是让对象不可扩展
obj.name = 'chen';//非严格模式下 也是不可扩展 但是不报错 静默失败
//严格模式下 直接报错
//报错信息:Cannot add property name, object is not extensible
console.log(obj);

参数名必须唯一

"use strict";
//这种情况 在真实情况 可能出在 写错 误写出重复的
function fn(a,a,b){//非严格模式下 这样定义有重复的形参名字 会按照最后一个重名的形参来算 类似变量重复声明//严格模式下 直接报错 不允许重复参数名  //报错信息:Duplicate parameter name not allowed in this contextconsole.log(a + a + b);
}fn(1,2,3);

arguments

"use strict";//开启严格模式
function fn(value){var value = 'chen';console.log(value);console.log(arguments[0]);
};
fn('cheng');//非严格模式下value是局部变量的值  arguments对象获取参数的值跟形参有关 但如果形参跟局部变量的名字一样 那么arguments的值就是局部变量的值
//严格模式下 arguments对象获取参数的值跟形参无关 就是你传入的是什么就是什么 就算形参跟局部变量名字一样也不会变function fn1(){return arguments.callee;//严格模式下 arguments对象不能直接调用callee()方法 只能在非严格模式下用//严格模式下 arguments.length可以用
}fn1();

函数声明的限制

ECMAScript 5中只有两个作用域即全局作用域和函数作用域 但在ECMAScript 6 中新加了一个新的作用域(块级作用域)

"use strict";
//全局作用域
function fn(){//局部作用域  函数作用域function n(){}
}
for(var i = 0;i <10; i++){//ECMAScript 6 新增的 块级作用域var v = 100;//就是在ECMAScript 6 中 这个变量不能直接被外界访问   因为新增了一个块级作用域事//如果是在严格模式下  只允许有全局和函数作用域 但只不允许在这定义函数 变量可以定义function f(){console.log('this is function');}//在严格模式下 这样在块级作用域定义函数会直接报错
}
console.log(v);
f();

增加的eval()作用域

eval()可以将一个字符串中的代码直接执行

"use strict";
eval("var v = 100;");//严格模式下 会加一个eval专门的作用域 就是除了当前的eval函数可以用外  其他都不能用eval中的内容
console.log(v);//非严格模式下 可以访问eval中的内容

禁止读写

严格模式下 禁止使用eval()和arguments作为标识符,也不允许读写它们的值

什么是标识: (唯一标识)

​ 使用var声明

​ 赋予另一个值

​ 尝试修改包含的值 比如数字运算符等

​ 作为函数名

​ 用作命名的函数的参数

​ 在try…catch语句中用作例外名 (就是catch后面的小括号里的值)

在严格模式下eval()和arguments以上这些操作都不行 不允许作为标识符

"use strict";//严格模式下 eval和arguments不允许作为标识符
eval = 17;
arguments++;
++eval;
var obj = {set p(arguments){}
};
var eval;
try{}catch(arguments){}
function x(eval){}
function arguments(){}

抑制this

在非严格模式下的apply()和call(),可以传入null和undefined值 会直接转化为全局对象

在严格模式下,函数的this值必须有指定的指向(必须有指向的对象 不能为null和undefined)

'use strict'var v = 100;function fn(){console.log(this.v);
}fn.apply(undefined);//严格模式下 必须传入this需要指向的对象 不能用null和undefined  不会默认用默认绑定规则

JavaScript中的严格模式相关推荐

  1. 39 JavaScript中的严格模式

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.什么是严格模式(strict model) JavaScript除了提供正常模式外,还 ...

  2. 详细介绍javascript中的单体模式singleton(全面)

    一.单体模式描述 1.单体模式是javascript中最基本但又最有用的模式之一,他可能比其他任何模式都常用. 2.这种模式提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码可以通过单一的 ...

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

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

  4. JavaScript中发布/订阅模式的理解

    订阅发布模式的介绍 发布订阅模式,它定义了一种一对多的关系,可以使多个观察者对象对一个主题对象进行监听,当这个主题对象发生改变时,依赖的所有对象都会被通知到. 在生活中我们常常遇到这样一种情况,我们在 ...

  5. 理解javascript中的函数模式

    1.回调函数 将一个函数作为参数传给另一个函数,我们称它为回调函数 function test1(callback){//执行脚本//执行回调函数 callback();} 2.即时函数(自执行匿名函 ...

  6. JavaScript面向对象中的严格模式

    概述 严格模式是什么 严格模式是JavaScript中的一种限制性更强的变种方式.严格模式不是一个子集:它在语义上与正常代码有着明显的差异. 不支持严格模式的浏览器与支持严格模式的浏览器行为上也不一样 ...

  7. 现代JavaScript中的精美图案:制冰厂

    I've been working with JavaScript on and off since the late nineties. I didn't really like it at fir ...

  8. 如何在JavaScript中声明名称空间?

    如何在JavaScript中创建名称空间,以使我的对象和函数不会被其他同名对象和函数覆盖? 我使用了以下内容: if (Foo == null || typeof(Foo) != "obje ...

  9. JavaScript中的设计模式

    设计模式是在软件工程领域中广泛使用的一种重要概念.它是指针对特定问题或情况的通用解决方案,通常由经过验证的最佳实践和经验构成.在JavaScript编程中,设计模式同样是一个非常重要的概念.在这篇文章 ...

最新文章

  1. 高阶函数||编程范式: 命令式编程/声明式编程 || 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数)
  2. oracle 08177,Java OracleDatabaseException: ORA-08177: 无法连续访问此事务处理问题解决
  3. axios post object object_Vue前端开发——数据交互axios
  4. HGE引擎写的俄罗斯方块程序(附vc源码)[r]
  5. tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError:)...
  6. 黄大刀 :机房建设主要标准规范的介绍
  7. 修改Python解释器和包路径
  8. MATLAB数学建模方法与实践(第3版)——读书笔记
  9. html 图片的缩略图,纯CSS制作缩略图片
  10. HP ProLiant DL380 G6内存错误导致WHEA-Logger 47报警的解决
  11. IC基础知识7-数据选择器
  12. 简单说一下寄存器寻址
  13. 该如何提高个人影响力
  14. Countdownlatch、CyclicBarrier、join区别
  15. SpringCloud之蓝绿部署
  16. 数据科学导论python语言实现_数据科学导论:Python语言实现(原书第2版)
  17. 01:高斯噪声和椒盐噪声
  18. 总结一下使用Emgucv的经验和经历
  19. 连锁商超行业使用OA系统实现人、财、物统一管控
  20. LaTex(windet及miktex)安装教程

热门文章

  1. android.net是哪个jar,【Android Clock Synchronization】Android时钟同步:基于NTP协议的第三方库Apache Commons Net......
  2. WIN7 远程桌面发生身份验证错误,要求的函数不受支持
  3. 华为鸿蒙系统学习笔记9-华为鸿蒙OS与LiteOS对比
  4. 常见三种存储方式DAS、NAS、SAN的架构及比较
  5. python 字符串匹配like_python中关于正则表达式一
  6. caioj:1682: 【贪心】买一送一
  7. iOS 10 (X8)上CoreData的使用(包含创建工程时未添加CoreData)
  8. SmartTimer的开发思路
  9. Redis2.6安装报错
  10. artDIalog 弹出层