网站访问速度跟服务器cpu和内存和带宽哪个重要,山东网络公司排名,模板背景图,网站频繁被攻击怎么办设立严格模式的原因#xff1a; - 消除Javascript语法的一些不合理、不严谨之处#xff0c;减少一些怪异行为; - 消除代码运行的一些不安全之处#xff0c;保证代码运行的安全#xff1b; - 提高编译器效率#xff0c;增加运行速度#xff1b; - 为未来新版本的Javascrip… 设立严格模式的原因 - 消除Javascript语法的一些不合理、不严谨之处减少一些怪异行为; - 消除代码运行的一些不安全之处保证代码运行的安全 - 提高编译器效率增加运行速度 - 为未来新版本的Javascript做好铺垫。 严格模式体现了Javascript更合理、更安全、更严谨的发展方向IE 10在内的主流浏览器 use strict;//是进入严格模式的标志(老版本的浏览器会把它当作一行普通字符串加以忽略。) 将use strict放在脚本文件的第一行则整个脚本都将以严格模式运行。如果这行语句不在第一行则无效整个脚本以正常模式运行。 针对原文这样的描述我已做过尝试例如 script typetext/javascript;use strict;a1;console.log(a)//1/script script typetext/javascript;use strict;a1;console.log(a)//1/script script typetext/javascriptuse strict;a1;//报错console.log(a)/script 以上的三种情况的测试所以我暂且认为 ‘use strict’ 是一定要放在第一行的。且前面不能有其他代码。 一如何调用 1.1、针对整个脚本文件 scriptuse strict;console.log(这是严格模式。);/scriptscriptconsole.log(这是正常模式。);/script 1.2、针对单个函数 将use strict放在函数体的第一行则整个函数以严格模式运行。 function strict(){use strict;return 这是严格模式。;}function notStrict() {return 这是正常模式。;} 1.3、脚本文件的变通写法 因为第一种调用方法不利于文件合并所以更好的做法是借用第二种方法将整个脚本文件放在一个立即执行的匿名函数之中。 script typetext/javascript (function(){use strict;function strict(){a1;console.log(a)}strict();function notStrict() {var a1;console.log(a)}notStrict();})()/script 二语法和行为的改变 2.1、全局变量显式声明 严格模式在严格模式下变量必须先用var声明然后再使用 use strict;a2;console.log(a)//报错for(i0;i5;i){ //报错console.log(i)} 正常模式 a2;console.log(a)//2for(i0;i5;i){console.log(i)//0 1 2 3 4} 2.2、静态绑定 1禁止使用with()语句 2创设eval作用域 正常模式下Javascript语言有两种变量作用域scope全局作用域和函数作用域。严格模式创设了第三种作用域eval作用域。 正常模式下eval语句的作用域取决于它处于全局作用域还是处于函数作用域。严格模式下eval语句本身就是一个作用域不再能够生成全局变量了它所生成的变量只能用于eval内部。 三、增强的安全措施 1禁止this关键字指向全局对象 function fn(){return !this;}console.log(fn())//false 因为this指向全局对象!this就是falsefunction fn2(){use strictreturn !this;}console.log(fn2())//true 因为严格模式下this的值为undefined所以!this为true。function fn3(){use strictreturn this;}console.log(fn3())//undefined 因为严格模式下this的值为undefined。 因此使用构造函数时如果忘了加newthis不再指向全局对象而是报错。 function fn(){use strictthis.a1;}fn()//报错this未定义 2禁止在函数内部遍历调用栈 function fn(){use strict;f1.caller; // 报错f1.arguments; // 报错}fn(); 四 禁止删除变量 严格模式下无法删除变量。只有configurable设置为true的对象属性才能被删除。 在非严格模式下是如何删除变量的 1对象属性可以删除 var obj{name:lili,age:18,sex:女}delete obj.name;console.log(obj.name)//undefined console.log(obj)//{age: 18, sex: 女} 2无法直接删除变量 var a1;delete a;console.log(a) //1 3删除不了原型链中的变量 function fun(){this.name lili;}var obj new fun();fun.prototype.age 18;delete obj.age;console.log(obj.age) //18 4显式报错 正常模式下对一个对象的只读属性进行赋值不会报错只会默默地失败。严格模式下将报错。 var o {};Object.defineProperty(o, v, { value: 1, writable: false });o.v 2;console.log(o)//1 虽然没有改变但是也没有报错 use strict;var o {};Object.defineProperty(o, v, { value: 1, writable: false });o.v 2; // 报错console.log(o) 严格模式下对一个使用getter方法读取的属性进行赋值会报错。 var o {get v() { return 1; }};o.v 2; console.log(o.v)//1 虽然没有改变但是没有报错 use strict;var o {get v() { return 1; }};o.v 2; // 报错console.log(o.v) 严格模式下对禁止扩展的对象添加新属性会报错。 var o {};Object.preventExtensions(o);o.v 1;console.log(o)//空对象 use strict;var o {};Object.preventExtensions(o);o.v 1; //console.log(o) 严格模式下删除一个不可删除的属性会报错。 delete Object.prototype; //无影响 use strict;
delete Object.prototype; // 报错 5重名错误 5.1对象不能有重名的属性 原文档如此表述但经过我测试只有在IE10和IE11的时候才会报错 strict 模式下不允许一个属性有多个定义基本上常规浏览器就是最后赋值 的属性覆盖掉前面的属性。 5.2 函数不能有重名的参数 正常模式下如果函数有多个重名的参数可以用arguments[i]读取。严格模式下这属于语法错误。 function f(a, a, b) { return a;}f(); use strict;function f(a, a, b) { // 语法错误return a;}f(); 6禁止八进制表示法 正常模式下整数的第一位如果是0表示这是八进制数比如0100等于十进制的64。严格模式禁止这种表示法整数第一位为0将报错。 use strict;var n 0100; // 语法错误 7 arguments对象的限制 arguments是函数的参数对象严格模式对它的使用做了限制。 1 不允许对arguments赋值 use strict; arguments; // 语法错误 var obj { set p(arguments) { } }; // 语法错误 try { } catch (arguments) { } // 语法错误 function arguments() { } // 语法错误 var f new Function(arguments, use strict; return 17;); // 语法错误 2 arguments不再追踪参数的变化 function f(a) { a 2; return [a, arguments[0]]; } f(1); // 正常模式为[2,2] function f(a) { use strict; a 2; return [a, arguments[0]]; } f(1); // 严格模式为[2,1] 3 禁止使用arguments.callee 这意味着你无法在匿名函数内部调用自身了。 use strict; var f function() { return arguments.callee; }; f(); // 报错 8 函数必须声明在顶层 将来Javascript的新版本会引入块级作用域。为了与新版本接轨严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说不允许在非函数的代码块内声明函数。 use strict; if (true) { function f() { } // 语法错误 } for (var i 0; i 5; i) { function f2() { } // 语法错误 } 9 保留字 为了向将来Javascript的新版本过渡严格模式新增了一些保留字implements, interface, let, package, private, protected, public, static, yield。 使用这些词作为变量名将会报错。 function package(protected) { // 语法错误 use strict; var implements; // 语法错误 } 此外ECMAscript第五版本身还规定了另一些保留字class, enum, export, extends, import, super以及各大浏览器自行增加的const保留字也是不能作为变量名的。 参考http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html转载于:https://www.cnblogs.com/xumqfaith/p/7841338.html