摘要:严格模式和非严格模式有什么区别严格模式对正常的语义做了一些更改。其次,严格模式修复了一些导致引擎难以执行优化的缺陷有时候,相同的代码,严格模式可以比非严格模式下运行得更快。
严格模式和非严格模式有什么区别:
严格模式对正常的 JavaScript语义做了一些更改。
首先,严格模式通过抛出错误来消除了一些原有静默错误。
其次,严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷:有时候,相同的代码,严格模式可以比非严格模式下运行得更快。
第三,严格模式禁用了在ECMAScript的未来版本中可能会定义的一些语法。
上文引用了MDN对严格模式的描述
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(); //报错
总结:推荐使用严格模式,因为能让代码更规范,也更利于后期的维护和排除错误。更加严谨。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/96337.html
摘要:作为构造函数何为构造函数所谓构造函数就是用来对象的函数,像等都是全局定义的构造函数。正在跑步正在说话正在跑步正在说话如上,如果函数作为构造函数用,那么其中的就代表它即将出来的对象。 前言 总括:详解JavaScript中的this的一篇总结,不懂this这个难点,很多时候会造成一些困扰,写出一些bug不知如何收场,所以一起来写bug吧,不对,一起来写代码吧。 原文地址:JavaScr...
摘要:和都是循环语句,不同的是检测表达式的位置。语句异常语句,所谓异常语句是发生异常或错误的一个标志或信号。抛出异常就是指这个状况,捕获异常实是指处理的过程。语句异常处理机制。语句严格模式中禁止使用语句。 1.switch语句 语句都很熟悉的啦,只是提一句。switch中的case语句匹配的规则实际上是===而非简单的==比较,case匹配不会做任何的类型转换的。 2.while和do/wh...
摘要:第二种情况是箭头函数的如果指向普通函数它的继承于该普通函数。箭头函数的指向全局,使用会报未声明的错误。 showImg(https://segmentfault.com/img/remote/1460000018610072?w=600&h=400); 箭头函数是ES6的API,相信很多人都知道,因为其语法上相对于普通函数更简洁,深受大家的喜爱。就是这种我们日常开发中一直在使用的API...
摘要:在严格模式中,当运算符后跟随非法的标识符比如变量函数函数参数时,将会抛出一个语法错误异常在非严格模式中,这种表达式什么也没做,并返回。 JavaScript之use strict use strict是ECMAScript 5引入的一条指令。指令不是语句(但非常接近于语句)。usestrict指令和普通的语句之间有两个重要的区别: 它不包含任何语言的关键字,指令仅仅是一个包含一个特殊...
摘要:把这个执行上下文压入调用栈的顶部,即设置成运行执行上下文。函数作为构造函数调用没有继承关系有继承关系我们把一个函数被当作构造函数,使用操作符调用时发生的主要步骤新建一个普通对象,把其原型指向构造函数的属性的值。把当前执行上下文弹出调用栈。 var currentTime = Date() 能生成一个当前时间的日期对象,var currentTime = new Date() 也能生成一...
阅读 3027·2021-09-22 15:59
阅读 1291·2021-08-30 09:46
阅读 2254·2019-08-30 15:54
阅读 1978·2019-08-26 12:15
阅读 2506·2019-08-26 12:09
阅读 1304·2019-08-26 11:57
阅读 3317·2019-08-23 17:11
阅读 1858·2019-08-23 15:59