JS的严格模式'usestrict'应该是大家比较熟悉的知识了。从字面上理解为遵循一种严格的行为模式来编写代码。但是有什么规则可以约束我们在开发过程中使用严格模式来规范自己的代码呢?所以这篇文章的目的只是为了再次加深对严格模式的理解。本文虽然是基础知识,但希望对大家有所帮助。严格模式usestrict的定义是ECMAscript5加入的一种(严格的)运行模式,使得Javascript在更严格的条件下运行。严格模式实现使您的程序或函数服从严格的运行环境。设置“严格模式”的目的主要是:剔除Javascript语法中一些不合理、不严谨的部分,减少一些怪异的行为;剔除代码运行中的一些不安全部分,保证代码运行的安全性;改进编译提高服务器效率,提高运行速度;为未来的Javascript新版本铺平道路。使用严格模式为脚本开启严格模式为整个脚本文件开启严格模式,需要在特定语句中放入“usestrict”;(或'usestrict';)在所有语句之前//整个脚本打开严格模式的语法"usestrict";varv="嗨!我是严格模式脚本!";如果合并一个严格模式脚本和一个非严格模式脚本,这种语法有一个陷阱:合并后它看起来是严格模式。反之亦然:严格看起来非严格的非严格合并。因此,建议要么启用严格模式,要么不使用非严格模式。为函数启用严格模式要为函数启用严格模式,请输入“usestrict”;(或“使用严格”;)在函数体中的所有语句之前逐字声明。functionstrict(){//函数级严格模式语法'usestrict';functionnested(){return"我也是!";}return"嗨!我是一个严格模式的函数!"+嵌套();}functionnotStrict(){返回“我不严格。”;}严格模式的规范变量在严格模式下,使用变量的规则不允许意外创建全局变量不能使用delete操作符删除声明变量不要使用保留字(例如:implements,interface,let,package,private,protected,public,static,andyieldidentifiers)asvariablenamesRule1//创建一个名为messagemessage="HelloJavaScript!"的全局变量//这行代码会抛出ReferenceErrorrule2varx;删除x;//!!!语法错误eval("vary;deletey;");//!!!语法错误规则3varprivate=123;//!!!语法错误varpublic='hello';//!!!语法错误对象在严格模式下,使用对象的规则为只读属性赋值将抛出TypeError。在不可配置的属性上使用delete运算符将抛出TypeError作为不可扩展的将属性添加到(不可扩展的)对象将抛出TypeError使用对象文字时,属性名称必须是唯一的Rule1//Assignavaluetoaread-only属性varobj2={getx(){返回17;}};obj2.x=5;//抛出TypeError//给不可写的属性赋值varobj1={};Object.defineProperty(obj1,"x",{value:42,writable:false});obj1.x=9;//ThrowATypeError错误规则2deleteObject.prototype;//抛出TypeError错误规则Then3//给不可扩展对象赋新属性varfixed={};Object.preventExtensions(fixed);fixed.newProp="ohai";//抛出TypeError错误规则4varo={p:1,p:2};//!!!语法错误function在严格模式下,函数的使用规则要求命名函数的参数必须是唯一的functionsum(a,a,c){//!!!语法错误returna+a+c;//代码运行到这里会出错}eval和arguments是严格模式,使用eval和arguments的规则eval不会在上下文中创建变量或函数。eval和arguments不能通过程序语法绑定(bebound)或赋值参数值不会随着arguments对象的值而变化。禁止使用arguments.calleefunctiondoSomething(){eval("varx=10");警报(x);//抛出TypeError错误}所有低于规则2的尝试都会导致语法错误:eval=17;arguments++;++eval;varobj={setp(arguments){}};vareval;try{}catch(arguments){}functionx(eval){}functionarguments(){}vary=functioneval(){};varf=newFunction("arguments","'usestrict';return17;");规则3函数f(a){a=42;return[a,arguments[0]];}varpair=f(17);console.assert(对[0]===42);console.assert(对[1]===17);规则4varf=function(){returnarguments.callee;};F();//抛出类型错误禁止遍历函数内部的调用栈functionrestricted(){restricted.呼叫者;//抛出类型错误restricted.arguments;//抛出类型错误}静态绑定禁止使用with语句eval()声明变量和函数只在当前eval内部作用域范围内有效1varx=17;with(obj){//!!!语法错误//如果不开启严格模式,with中的x会指向with上面的x,还是obj.x?//不运行代码我们无法知道,所以这种代码会阻止引擎优化并减慢x;}规则2varresult=eval("varx=10,y=11;x+y");警报(结果);//21函数中指向全局作用域的this不再指向全局而是未定义。如果在使用构造函数时忘记添加new,this不再指向全局对象,undefined会报错//Rule1functionbar(){console.log(this)}bar()//undefined//Rule2functionPerson(){this.name="Vincent"//UncaughtTypeError:Cannotsetproperty'name'ofundefined}Person()//报错,如果在使用构造函数时忘记添加new,this不再指向全局对象,但undefined.name。综上所述,现在很多人都沉浸在使用各种框架和工具中。其实在我们实际开发中是没有问题的,因为它带来了效率的提升。但万物不能无根生长,所以根基永远是最基本的核心。我也知道大家时间有限,不能玩太多。但我还是建议花一些时间在基础上,哪怕你每天花10-20分钟看基础,因为每读一遍,你都会有所收获。自己的技术不是很好,基础也不扎实,所以每天都提醒自己不要停止前进。###参考资料-【JavaScript高级编程(第3版)】(https://item.jd.com/10951037.html)-【严格模式MDN】(https://developer.mozilla.org/zh-CN/文档/Web/JavaScript/参考/严格模式)
