范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

jsusestrict说一下JavaScript严格模式下有哪些不同

  严格模式中的变化
  ECMAScript 5 的严格模式是采用具有限制性 JavaScript 变体的一种方式,从而使代码显示地脱离"马虎模式/稀松模式/懒散模式"(sloppy)模式。
  严格模式同时改变了语法及运行时行为。变化通常分为这几类:将问题直接转化为错误(如语法错误或运行时错误), 简化了如何为给定名称的特定变量计算,简化了 eval 以及 arguments, 将写"安全"JavaScript 的步骤变得更简单,以及改变了预测未来 ECMAScript 行为的方式。 1.1 将过失错误转成异常严格模式下无法再意外创建全局变量。 "use strict"; // ReferenceError mistypedVaraible = 17;严格模式会使引起静默失败的赋值操作抛出异常
  例如, NaN 是一个不可描述的全局变量. 在正常模式下, 给 NaN 赋值不会产生任何作用; 开发者也不会受到任何错误反馈. 但在严格的模式下, 给 NaN 赋值会抛出一个异常. 任何在正常模式下引起静默失败的赋值操作 (不可写属性赋值, 给只读属性(getter-only)赋值, 给不可扩展对象(non-extensible object)的新属性赋值) 都会抛出异常: "use strict";  // 给不可写属性赋值 var obj1 = {}; Object.defineProperty(obj1, "x", { value: 42, writable: false }); obj1.x = 9; // 抛出TypeError错误  // 给只读属性赋值 var obj2 = {   get x() {     return 17;   }, }; obj2.x = 5; // 抛出TypeError错误  // 给不可扩展对象的新属性赋值 var fixed = {}; Object.preventExtensions(fixed); fixed.newProp = "ohai"; // 抛出TypeError错误在严格模式下, 试图删除不可删除的属性时会抛出异常
  之前这种操作不会产生任何效果 "use strict"; delete Object.prototype; // 抛出TypeError错误严格模式要求函数的参数名唯一
  在正常模式下, 最后一个重名参数名会掩盖之前的重名参数. 之前的参数仍然可以通过  arguments[i]   来访问, 还不是完全无法访问. 然而, 这种隐藏毫无意义而且可能是意料之外的 (比如它可能本来是打错了), 所以在严格模式下重名参数被认为是语法错误: function sum(a, a, c) {   // !!! 语法错误   "use strict";   return a + a + c; // 代码运行到这里会出错 }严格模式禁止八进制数字语法
  ECMAScript 并不包含八进制语法, 但所有的浏览器都支持这种以零(0)开头的八进制语法:  0644 === 420   还有  45" === "%"  在 ECMAScript 6 中间为一个数字加"0o"的前缀来表示八进制数. var a = 0o10; // ES6: 八进制ECMAScript 6 中的严格的模式禁止设置 primitive 值得属性
  不采用严格模式,设置属性将会简单忽略(no-op),采用严格模式,将抛出 TypeError 错误 (function () {   "use strict";    false.true = ""; //TypeError   (14).sailing = "home"; //TypeError   "with".you = "far away"; //TypeError })();1.2 简化变量的使用
  严格模式简化了代码中变量名字映射到变量定义的方式. 很多编译器的优化是依赖存储变量 X 位置的能力:这对全面优化 JavaScript 代码至关重要. JavaScript 有些情况会使得代码中名字到变量定义的基本映射只在运行时才产生. 严格模式移除了大多数这种情况的发生, 所以编译器可以更好地优化严格模式的代码. 严格模式禁用 with
  with 所引起的问题是块内的任何名称可以映射(map)到 with 传进来的对象的属性, 也可以映射到包围这个块的作用域内的变量(甚至是全局变量), 这一切都是在运行时决定的: 在代码运行之前是无法得知的. 严格模式下, 使用 with 会引起语法错误, 所以就不会存在 with 块内的变量在运行时才决定引用到哪里的情况了: "use strict"; var x = 17; with (obj) {   // !!! 语法错误   // 如果没有开启严格模式,with中的这个x会指向with上面的那个x,还是obj.x?   // 如果不运行代码,我们无法知道,因此,这种代码让引擎无法进行优化,速度也就会变慢。   x; }严格模式下 eval 不再为上层范围引入新变量
  在正常模式下, 代码  eval("var x;")   会给上层函数(surrounding function)或者全局引入一个新的变量  x   . 这意味着, 一般情况下, 在一个包含  eval   调用的函数内所有没有引用到参数或者局部变量的名称都必须在运行时才能被映射到特定的定义 (因为 eval 可能引入的新变量会覆盖它的外层变量). 在严格模式下 eval 仅仅为被运行的代码创建变量, 所以 eval 不会使得名称映射到外部变量或者其他局部变量: var x = 17; var evalX = eval(""use strict"; var x = 42; x"); console.assert(x === 17); console.assert(evalX === 42);
  相应的, 如果函数 eval 被在严格模式下的 eval(...)  以表达式的形式调用时, 其代码会被当做严格模式下的代码执行. 当然也可以在代码中显式开启严格模式, 但这样做并不是必须的. function strict1(str) {   "use strict";   return eval(str); // str中的代码在严格模式下运行 } function strict2(f, str) {   "use strict";   return f(str); // 没有直接调用eval(...): 当且仅当str中的代码开启了严格模式时   // 才会在严格模式下运行 } function nonstrict(str) {   return eval(str); // 当且仅当str中的代码开启了"use strict",str中的代码才会在严格模式下运行 }  strict1(""Strict mode code!""); strict1(""use strict"; "Strict mode code!""); strict2(eval, ""Non-strict code.""); strict2(eval, ""use strict"; "Strict mode code!""); nonstrict(""Non-strict code.""); nonstrict(""use strict"; "Strict mode code!"");
  因此,在 eval 执行的严格模式代码下,变量的行为与严格模式下非 eval 执行的代码中的变量相同。 严格模式禁止删除声明变量
  delete name   在严格模式下会引发语法错误 "use strict";  var x; delete x; // !!! 语法错误1.3 让 eval 和 arguments 变的简单
  严格模式让 arguments 和 eval 少了一些奇怪的行为。两者在通常的代码中都包含了很多奇怪的行为: eval 会添加删除绑定,改变绑定好的值,还会通过用它索引过的属性给形参取别名的方式修改形参. 虽然在未来的 ECMAScript 版本解决这个问题之前,是不会有补丁来完全修复这个问题,但严格模式下将 eval 和 arguments 作为关键字对于此问题的解决是很有帮助的。 名称 eval 和 arguments 不能通过程序语法被绑定(be bound)或赋值
  以下的所有尝试将引起语法错误: "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;");严格模式下,参数的值不会随 arguments 对象的值的改变而变化。
  在正常模式下,对于第一个参数是 arg 的函数,对 arg 赋值时会同时赋值给  arguments[0]  ,反之亦然(除非没有参数,或者  arguments[0]   被删除)。严格模式下,函数的 arguments 对象会保存函数被调用时的原始参数。 arguments[i]   的值不会随与之相应的参数的值的改变而变化,同名参数的值也不会随与之相应的  arguments[i]   的值的改变而变化。 function f(a) {   "use strict";   a = 42;   return [a, arguments[0]]; } var pair = f(17); console.assert(pair[0] === 42); console.assert(pair[1] === 17);不再支持 arguments.callee。
  正常模式下,arguments.callee 指向当前正在执行的函数。这个作用很小:直接给执行函数命名就可以了!此外,arguments.callee 十分不利于优化,例如内联函数,因为 arguments.callee 会依赖对非内联函数的引用。在严格模式下,arguments.callee 是一个不可删除属性,而且赋值和读取时都会抛出异常: "use strict"; var f = function () {   return arguments.callee; }; f(); // 抛出类型错误1.4 安全的 JavaScript
  严格模式下更容易写出"安全"的 JavaScript。 在严格模式下通过 this 传递给一个函数的值不会被强制转换为一个对象。
  对一个普通的函数来说,this 总会是一个对象:不管调用时 this 它本来就是一个对象;还是用布尔值,字符串或者数字调用函数时函数里面被封装成对象的 this;还是使用 undefined 或者 null 调用函数式 this 代表的全局对象(使用 call, apply 或者 bind 方法来指定一个确定的 this)。这种自动转化为对象的过程不仅是一种性能上的损耗,同时在浏览器中暴露出全局对象也会成为安全隐患,因为全局对象提供了访问那些所谓安全的 JavaScript 环境必须限制的功能的途径。所以对于一个开启严格模式的函数,指定的 this 不再被封装为对象,而且如果没有指定 this 的话它值是 undefined:。 在严格模式中再也不能通过广泛实现的 ECMAScript 扩展"游走于"JavaScript 的栈中。
  在普通模式下用这些扩展的话,当一个叫做 fun 的函数正在被调用的时候,fun.caller 是最后一个调用 fun 的函数,而且 fun.arguments 包含调用 fun 时用地形参。这两个扩展接口对于"安全"JavaScript 而言都是有问题的,因为他们允许"安全的"代码访问"专有"函数和他们的(通常是没有经过保护的)形参。如果 fun 在严格的模式下,那么 fun.caller 和 fun.arguments 都是不可删除的属性而且在存值、取值时都会报错:
  function restricted() {   "use strict";   restricted.caller; // 抛出类型错误   restricted.arguments; // 抛出类型错误 } function privilegedInvoker() {   return restricted(); } privilegedInvoker();严格模式下的 arguments 不会再提供访问与调用这个函数相关的变量的途径。
  在一些旧时的 ECMAScript 实现中 arguments.caller 曾经是一个对象,里面存储的属性指向那个函数的变量。这是一个安全隐患,因为它通过函数抽象打破了本来被隐藏起来的保留值;它同时也是引起大量优化工作的原因。出于这些原因,现在的浏览器没有实现它。但是因为它这种历史遗留的功能,arguments.caller 在严格模式下同样是一个不可被删除的属性,在赋值或者取值时会报错: "use strict"; function fun(a, b) {   "use strict";   var v = 12;   return arguments.caller; // 抛出类型错误 } fun(1, 2); // 不会暴露v(或者a,或者b)1.5 为未来的 ECMAScript 版本铺平道路
  未来版本的 ECMAScript 很有可能会引入新语法,ECMAScript5 中的严格模式就提早设置了一些限制来减轻之后版本改变产生的影响。如果提早使用了严格模式中的保护机制,那么做出改变就会变得更容易。 在严格模式中一部分字符变成了保留的关键字。
  这些字符包括 implements, interface, let, package, private, protected, public, static 和 yield。在严格模式下,你不能再用这些名字作为变量名或者形参名。 严格模式禁止了不在脚本或者函数层面上的函数声明。
  在浏览器的普通代码中,在"所有地方"的函数声明都是合法的。这并不在 ES5 规范中(甚至是 ES3)!这是一种针对不同浏览器中不同语义的一种延伸。未来的 ECMAScript 版本很有希望制定一个新的,针对不在脚本或者函数层面进行函数声明的语法。在严格模式下禁止这样的函数声明对于将来 ECMAScript 版本的推出扫清了障碍。 "use strict"; if (true) {   function f() {} // 语法错误   f(); } for (var i = 0; i < 5; i++) {   function f2() {} // !!! 语法错误   f2(); }  function baz() {   // 合法   function eit() {} // 同样合法 }
  这种禁止放到严格模式中并不是很合适,因为这样的函数声明方式从 ES5 中延伸出来的。但这是 ECMAScript 委员会推荐的做法,浏览器就实现了这一点。

赛力斯华为智选SF5节能性能智能,新能源市场的王炸在大的政策方针下,发展新能源汽车已经成为板上钉钉的事,目前有关新能源的几种技术路线,无外乎就是纯电插电混动增程式混动。就最终目标而言,纯电车型肯定是我们最终的发展目标,但当下受限于数字经济企业出海迎良机来源人民网人民日报海外版张贤达作(新华社发)随着新一轮科技革命和产业变革深入发展,数字经济成为全球经济增长的新引擎。商务部中央网信办工信部日前联合印发数字经济对外投资合作工作指引,海外支付快讯!Facebook考虑在电子钱包中配套NFT相关功能21。8。31海外支付快讯01hr数字身份管理服务商Linktree与PayPal合作接受用户直接付款8月25日消息,数字身份管理服务商Linktree近日宣布与PayPal合作拓电动车公共充电桩面临怎样的困局?高质量能源内容,点击右上角加关注第一次用公共充电桩,没想到折腾到现在才充上电。家住北京市大兴区的李先生无奈地说,换了好几个充电桩,耗费了一些时间才在一家大型商场的地下停车场公共充电华为马海旭5G工业互联网已从创新试点逐步走向规模发展新京报贝壳财经讯(记者许诺)9月1日,在2021世界5G大会的5G与工业互联网高端论坛上,华为副总裁华为ICT产品组合管理与解决方案部总裁马海旭表示,目前,中国运营商已开展了600向左现代,向右富士康,苹果造车选择谁?来到了2021年下半年,关于苹果造车的消息一直时不时传入耳中,在相当长的时间内大家仿佛已经认定了苹果汽车量产只是假以时日的事情。但到目前为止,关于苹果汽车的新闻,更多的还只是一些人流量排名世界前50的网站,你知道几个?根据外网similarweb的数据统计,截至2021年7月,世界网站流量排名前50如下我们可以看到,谷歌,油管,脸书占据前三。国内排名最靠前的为百度,位居第6名。国内共有4个网站进腾讯放弃独家版权资本的逻辑,刚不过就跪8月3日晚间,腾讯在官方公众号上发表声明称,将放弃音乐版权独家授权权利(与独立音乐人独家合作期限不超过三年,及新歌独家首发期不超过三十日之情形除外)。也就是说,从此以后,音乐公司等17亿收编叛将李一男,这场华为内斗,任正非真的赢了么?任正非喜欢两类人,一类是年轻人,一类是有才华的年轻人。在华为的创业史上,涌现出不少这样的人。比如华为2号人物郑宝用余大嘴余承东天才少年李一男。其中,任正非最喜欢的当属李一男。从19特斯拉开始招募工程师人形机器人即将量产爱卡汽车海外新车原创在前不久,刚刚过去的特斯拉人工智能日(AIDay)宣传活动中,特斯拉人形机器人(TeslaBot)的首次亮相吸引了所有人关注的目光。按照特斯拉CEO马斯克的说法美团创始人王兴,共同富裕植根于美团的基因,高段位解读建议收藏作为近期最为热门的话题之一,共同富裕仿佛成为了一个风向标,也像是一张检测企业正确指数的试卷,很多嗅觉灵敏的企业纷纷举手抢答,仿佛这道题他们都会做一样。在这些举手抢答的企业里,美团的
准确适用惩罚性赔偿!百度烤肉案判赔230万近日,由天驰君泰商标团队代理百度公司诉京百度餐饮公司使用百度烤肉商标侵权案由北京知识产权权法院一审审结,北京知识产权法院认定应纳入侵权损害赔偿计算的侵权时间为5。25年,并适用三倍北京邮电大学与银河航天初步完成5G卫星接入组网通信测试来源中国新闻网中新网北京10月22日电(记者郭超凯)2021中国无线电大会10月20日至21日在北京召开。记者从会上获悉,北京邮电大学与银河航天初步完成5G卫星接入组网通信测试。大疑似荣耀子品牌上线叫星耀?上周的时候网传荣耀品牌将会延续华为的做法推出全新子品牌系列,今天,网上出现了许多名为星耀的微信小程序商城图片,疑似为荣耀的子品牌名称。从微信小程序的认证上可以看到,星耀商城的认证是苹果13被曝64GB储存卖5499元!分析完原因后,网友不交智商税如无意外,iPhone13应该会在九月中旬被正式推出,然而现在关于它的消息,在网上已经快被扒光了!有不少人在了解到信息后,开始对苹果的配置提出质疑,为什么定价5499元的手机,配置格力宣布与腾讯云达成合作,网友华为鸿蒙系统还接不接入了?8月24日早上,据格力电器官方公众号格力新媒体透露格力电器与腾讯云正式达成深化合作协议。双方将基于腾讯云物联网控制台以及微信小程序开发服务,为格力提供便捷的C端物联网应用入口,满足2599元起!2022年第一台手机就从这四款热门机里挑手机中国导购2022年已经到来,在这崭新一年的开始之际,很多朋友都准备在这时给自己购置许多新装备,其中一台新的手机就成为大多数人的选择。新年新气象,许多人为了一个好寓意,会选择换一12月手机好评榜三星连续4个月夺冠,国产千元机挤进前三12月新机性能榜之后,也迎来了该月的好评榜。需要说明的是,好评榜与性能榜流畅榜不同,整个榜单很少有新机登榜,主要是新机型发布时间较短没有足够的评价做作支撑,其次是因为一些新机不一定科大讯飞听书神器APP被指侵犯著作权本报讯(记者周瑞平通讯员王君)科大讯飞股份有限公司(以下简称科大讯飞)开发的听书神器APP根据用户的请求,可以实时将网络作品合成语音供用户收听。有公司发律师函提出,该软件内转码及文电动车产业链最强车企特斯拉全球车企都在向电动汽车发展,产业链的整合成了重中之重。产业链整合哪家强呢?我们要分清楚最强和最全的区别,还要分清楚传统最强和电动车最强最全的区别。传统汽车最全产业链无疑是丰田,最强买尼康Z524200还是索尼A7M3腾龙28200?这两款镜头属于低端品质,在国外属于儿童玩具系列,塑料壳,画质相当不好,色彩陈旧感十足,分辨率也没有技术指标,(日本的特龙专门生产类似这样镜头)A7m3腾龙35150好很多这两个买哪kindle值得买吗?单反穷三代,kindle富一生。这是网上的一首打油诗,kindle是亚马逊推出的一款电纸书,用了电子墨水屏幕,努力做到纸质书的感觉,同时在阅读的过程中,不会出现微信和其他广告信息的