博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
严格模式和非严格模式区别
阅读量:6079 次
发布时间:2019-06-20

本文共 1835 字,大约阅读时间需要 6 分钟。

严格模式和非严格模式有什么区别:

严格模式对正常的 JavaScript语义做了一些更改。
首先,严格模式通过抛出错误来消除了一些原有静默错误。
其次,严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷:有时候,相同的代码,严格模式可以比非严格模式下运行得更快。
第三,严格模式禁用了在ECMAScript的未来版本中可能会定义的一些语法。

上文引用了


1.变量必须声明才能使用(在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种写法)

2.禁止使用with语句(因为with语句无法在编译时就确定,属性到底归属于哪个对象,严格模式有利于编译效率提高)

3.创建eval作用域(正常模式下,js有两种变量作用域,全局作用域和局部作用域,正常模式下eval语句作用域取决于它处于全局作用域还是函数作用域,严格模式下eval语句本身就是作用域,不能够生成全局变量,所生成的变量只能用于eval内部)

4.禁止this关键字指向全局对象(严格模式下全局作用域中定义的函数中的this为undefined)。例如:

function f(){   return !this; //返回的是false,因为this指向的是全局对象,!对象 == false } function f(){   "use strict"   return !this; //返回的是true,因为严格模式下,this的值为undefined,!undefined == true }

5.禁止在函数内部遍历调用栈( caller:调用当前函数的函数的引用,即外层函数的引用; )

function f1(){    "use strict";    f1.caller; //报错    f1.arguments; //报错}f1();

6.严格模式下无法删除变量。只有conifgurable设置为true的对象属性才能被删除

"use strict"var x ;delete x; //严格模式下报语法错误var o = Object.create(null,{'x':{    value: 1,    configurable: true}})delete o.x; //删除成功

7.显示报错(正常模式下对一个对象的只读属性进行赋值,不会报错,只会默默失败。严格模式下将报错)

"use strict";var o = {};Object.defineProperty(o,"v",{value: 1,writable: false});o.v = 2; //报错,因为o.v属性是不能被修改的,严格模式会报错,正常模式会失败但不报错

8.严格模式下,对禁止扩展的对象添加新属性,会报错

"use strict";var o = {};Object.preventExtensions(o);//禁止o对象有拓展属性o.v = 1; //报错

9.严格模式下,删除一个不可删除的属性,报错

"use strict";delete Object.prototype; //报错

10.对象拥有多个同名属性,严格模式报错。正常模式会默认值为最后一个

11.函数不能有重名的参数,严格模式会报错,正常模式可以通过arguments[i]来获取对应的参数

12.禁止八进制写法,正常情况下整数第一位为0代表八进制,严格模式下整数第一位为0则报错

13.不准对arguments赋值

14.严格模式下的arguments不在追踪参数的变化

function fn(a){    a=2;    return [a,arguments[0]];}fn(1); //正常模式返回值 [2,2]"use strict"function fn(a){    a = 2;    return [a,arguments[0]];}fn(1); //严格模式返回值 [2,1] 参数传进来是多少就是多少,arguments不会变化

15.禁止使用arguments.callee(无法在匿名函数内部调用自身了。arguments.callee指向的就是该函数本身)

var f = function (){    return arguments.callee;}f(); //报错

总结:推荐使用严格模式,因为能让代码更规范,也更利于后期的维护和排除错误。更加严谨。

转载地址:http://qghgx.baihongyu.com/

你可能感兴趣的文章
Flux OOM实例
查看>>
07-k8s-dns
查看>>
Android 中 ListView 分页加载数据
查看>>
oracle启动报错:ORA-00845: MEMORY_TARGET not supported on this system
查看>>
Go方法
查看>>
Dapper丶DapperExtention,以及AbpDapper之间的关系,
查看>>
搞IT的同学们,你们在哪个等级__那些年发过的帖子
查看>>
且谈语音搜索
查看>>
MySQL数据库导入导出常用命令
查看>>
低版本Samba无法挂载
查看>>
Telegraf+Influxdb+Grafana构建监控平台
查看>>
使用excel 展现数据库内容
查看>>
C#方法拓展
查看>>
MySql.Data.dll的版本
查看>>
Linux系统磁盘管理
查看>>
hdu 2191 (多重背包+二进制优化)
查看>>
home.php
查看>>
neo4j---删除关系和节点
查看>>
redis分布式锁redisson
查看>>
什么样的企业可以称之为初创企业?
查看>>