1.什么是严格模式?我们通常编写的JavaScript代码通常以正常模式运行。除了正常运行模式,ECMAscript 5还增加了第二种运行模式:“严格模式”。只看名字,这种模式会让JavaScript在更严格的环境下运行。包括IE 10在内的主流浏览器已经支持,很多大项目也开始全面拥抱。(github上的很多项目都使用严格模式)2。启用严格模式为整个脚本启用严格模式,并在所有语句前放置一个特定语句“使用严格”;假设有一个脚本reeoo.js,可以像这样打开严格模式:
使用“严格”;var name=' Reeooconsole.log(名称);“但是”的写作有一个天然的漏洞。如果我们想合并代码,我会把heigui.js:
heigui=' db与re EO . js合并后,这两个脚本分开执行是很好的,当合并时,它们会报告错误。八月引用错误:没有定义Heigui(……)严格模式下的脚本和非严格模式下的脚本组合可能会导致非严格模式下的脚本代码报错,所以建议将代码包装在立即执行函数中。
(function(){ '使用strict ';var name=' reeoo})();(function(){ hei GUI=' db ';})();这样,合并后就不会出现报错的情况。为函数启用严格模式要为函数启用严格模式,必须输入“使用严格”;只需将声明放在函数体的所有语句之前。
Function strictFun(){ //函数级严格模式语法‘使用严格’;console . log(‘我是一个严格模式函数!’);} fun NormaL fun(){ console . log('我是一个普通函数!');}Chrome中的调试严格模式。我有这个代码:
使用严格的' name=' reeooConsole.log(name)将这段代码直接粘贴到Chrome的控制台中执行。在正常情况下,它应该报告错误,但它不报告错误。
显然,在严格模式下声明变量不适用是违法的,但是为什么没有报错呢?这到底是什么?Chrome不支持严格模式?开什么玩笑。网上搜了一下,原来Chrome的控制台的代码是在eval中运行的,所以不能对eval函数使用严格模式(应该不完全正确,但是不知道Chrome做了什么)。下图显示eval函数可以使用严格模式:
如果你想在Chrome浏览器中以严格模式报告错误,你需要在代码的外层放一个立即执行函数,或者其他类似的措施。
(function(){ '使用严格的' name=' reeooConsole.log(name)})()就是这样。火狐代码草稿纸调试严格模式Chrome要求我们包裹一层闭包才能运行严格模式。既然这么麻烦,有没有其他直接运行严格模式代码的方法?火狐有一个可以直接运行的代码草稿纸,还有快捷键SHIFT F4。
严格模式有多严格?严格模型中的一些重要限制。
1.变量声明不允许使用未声明的变量。
使用“严格”;name=' reeoo错误报告(代码草稿纸,下同)异常:引用错误:赋值给未声明的变量名。
2.修改只读属性的值。
使用“严格”;Testobj=对象。definepreproperties({ },{prop1: {value:10,writable : false//一个只读属性},prop 23360 { get : function(){ });testObj.prop1=20//尝试更改prop1 testObj.prop2=30的值;//尝试更改prop2的值将在严格模式下报告错误:不清楚typeerror :无法分配给# object的只读属性“prop1”。在非严格模式下,最多不能赋值,也不会报告错误。
3.修改不可扩展属性意味着将该属性添加到可扩展属性设置为false的对象中。
使用“严格”;var testObj=新对象();object . PrevenTextExtensions(TestObj);//此方法处理的对象不会影响对原对象的删除和修改。但是,不能添加新的属性成员。testObj.name=' reeoo在严格模式下报告的错误:不清楚类型错误:无法添加属性名,对象不可扩展。非严格模式不会报告错误,但不会扩展testObj。4.删除变量、函数或参数,并删除其可配置属性设置为false的属性。
使用“严格”;var testvar=15,TestObj={ };函数TestFunc(){ };删除testvar删除testFuncobject . defineperoperty(TestObj,' testvar ',{ value: 10,configurable : false });删除testObj.testvar错误:不清楚的语法错误:在严格模式下删除不合格的标识符。
5.在严格模式下,对象文本中的属性不允许有多个定义。
使用“严格”;var testObj={ prop1: 10,prop2: 15,prop 1: 20 };错误报告(节点控制台)严格模式下不允许对象文本中有重复的数据属性。在正常模式后声明的重复变量将覆盖先前声明的变量,并且不会报告错误。注意:这个问题已经在ECMAScript6中修复了。
6.严格模式下不允许形式参数有重复的参数名。
使用“严格”;函数testFunc(param1,param 1){ return 1;};错误:不清楚的语法错误:在此上下文中不允许重复的参数名。
7.不能使用标识符的未来保留字。在严格模式下,将保留标识符名称的标识符(在ES6中仍未实现)不能在严格模式下使用,否则将报告错误。使用到此结束:意外语法错误:意外严格模式保留字。
实现接口包私有保护公共静态产出8。严格模式下不允许八进制数字参数和转义字符。
使用“严格”;var testoctal=010var testescape= 010报告的错误:意外语法错误:意外标记非法(…) 9。当该值为null或未定义时,该值不会转换为全局对象,例如:
使用“严格”;函数testFunc() {返回此;} var test var=TestFunc();在非严格模式下,testvar的值是全局对象窗口,但在严格模式下,该值是未定义的。
10.字符串“eval”不能用作标识符(变量或函数名、参数名等)。).
使用“严格”;var eval='呵呵';未捕获语法分析器:严格模式下的意外求值或参数
11.在严格模式下,函数声明不能嵌套在语句或块中。它们只能显示在顶层或直接显示在功能体中。
使用“严格”;var arr=[1,2,3,4,5];var索引=nullfor(arr中的索引){ function my func(){ };}node console :语法错误:在严格模式代码中,函数只能在顶级声明或立即在另一个函数中声明。但是这个限制在ES6中已经被修复了。12.严格模式下的eval用法无效。如果在eval函数中声明了变量,则不能在该函数之外使用。
使用“严格”;eval(' var test var=10 ');console . log(test vars);未定义未捕获的引用错误: testvar
13.严格模式下“参数”的用法无效。字符串“参数”不能用作标识符(变量或函数名、参数名等)。).
使用“严格”;var参数=1;未捕获语法分析器:严格模式下的意外求值或参数
这类似于上文第10条中的限制。14.参数在函数中,参数对象成员的值不能更改。
使用“严格”;函数testArgs(oneArg){ arguments[0]=20;}在非严格模式下,可以通过更改参数[0]的值来更改oneArg参数的值,这样oneArg和参数[0]的值都是20。在严格模式下,更改参数[0]的值不会影响oneArg的值,因为参数对象只是本地副本。15.参数。不允许被调用方。
使用“严格”;函数my(testInt) { if (testInt -==0)返回;arguments . calleer(TestInt-);} my(100);最终结果如下:不清楚typeerror :“调用者”、“被调用者”和“参数”属性可能无法在严格模式函数上访问,或者调用M16的参数对象不允许使用。
使用“严格”;with(Math){ x=cos(3);y=tan(7);}不清楚的语法错误:严格模式代码可能不包含with语句为什么要使用严格模式?既然这个模式有这么多限制,我为什么要用它呢?你有闲置的鸡蛋吗?当然,JavaScript作为浏览器最初使用的脚本语言,有着非常好的容错性。即使你的代码不是用标准的方式编写的,也不会报错,但有时会成为代码隐患。严格模式启动后,会对JavaScript的一些不合理、不精确的语法进行控制,这样可以更严谨地编写JavaScript代码,成为更好的程序员。严格模式是ES5时代的产物,ES2015也在普及的路上,是时候用严格模式了!
00-1010严格模式严格模式原创:http://reeoo.me/archives/strictmode.html.