block-quote 在本页chevron-down
copy 复制 chevron-down
Frontend chevron-right 代码规范 JS 严格模式是采用具有限制性 Javascript 变体的一种方式,从而使代码隐式地脱离 “马虎模式/稀松模式/懒散模式“ (sloppy)模式。
修复了一些导致 Javascript 引擎难以执行优化的缺陷:有时候,相同的代码,严格模式可以比非严格模式下运行得更快 。
禁用了在 ECMAScript 的未来版本中可能会定义的一些语法。
整个文件开启: 在文件所有语句之前,放一个特定语句 "use strict"; 或者 'use strict';。
单个函数开启:在函数体所有语句之前,放一个特定语句 "use strict"; 或者 'use strict';。
不要在封闭大括号({})内这样做,在这样的上下文中这么做是没有效果的。
将过失错误转成异常。
引起静默失败的赋值操作抛出异常,包括:对一个对象的只读属性进行赋值、对一个使用 getter 方法读取的属性进行赋值、对禁止扩展的对象添加新属性等。
禁止八进制数字语法,非严格模式下,整数的第一位如果是 0,表示这是八进制数,比如 0100,但严格模式禁止这种表示法,整数第一位为 0,将报错。
禁止设置原始值的属性,如,(1).prop = 'a'。
简化变量的使用。
eval 语句会创建 eval 作用域,不会给上层函数或者全局引入一个新的变量。
让 eval 和 arguments 变的简单。
eval、arguments 不能作变量名或赋值。
函数的传参不会随 arguments 对象的值的改变而变化。
让 JavaScript 更安全。
JavaScript 提供了一些方法(eval、Function等),给用户编写能够被其他用户执行的 Javascript 代码。在浏览器环境下,Javascript 能够获取用户的隐私信息,因此这类 Javascript, 有部分必须在运行前转换,检查是否有访问禁用功能的权限。有些函数如果滥用,会导致运行时的检查带来相当大的性能成本。
一些严格模式的调整,要求用户提交的 Javascript 代码是严格模式,并以特定的方式调用,大大减少了运行时检查的需要。
通过 this 传递给一个函数的值不会被强制转换为一个对象。比如,call、apply、bind 方法的第一个参数是原始值时,不会自动转换为对象。
禁止存取函数的 caller、arguments 属性。
复制 function func () {
" use strict " ;
func . caller . name
func . arguments
}
function f1 ( a , b ) {
return func ( a , b ) ;
}
f1 ( 1 , 2 ) ;
// Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them fun.caller 指向最后一个调用 fun 的函数,而且 fun.arguments 是最后一个调用时的传参。严格模式下,caller、arguments 是不可存取的。
禁止存取 arguments 的 callee 属性。
复制 function func () {
" use strict " ;
arguments . callee
}
func ()
// Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them 为未来的 ECMAScript 版本铺平道路。
新增一些保留字:implements、interface、let、package、private、protected、public、static、yield。ECMAscript 第五版本身还规定了另一些保留字:class、enum、export、extends、import、super,以及各大浏览器自行增加的 const 保留字。
只允许在全局作用域或函数作用域的顶层声明函数,也就是,if、for 代码块内或者其他大括号({})块内不允许声明函数。
最后,记得在支持或者不支持严格模式的浏览器中测试代码。如果只在不支持严格模式的浏览器中测试,那么在支持的浏览器中就很有可能出问题,反之亦然。
尽量使用 ES6 语法。
最外层统一使用单引号,有变量时,使用模板字符串 (``)。
使用标准的 ES6 模块语法 import 和 export。
禁止使用保留字作为对象的键值,这样在 IE8 下不会运行
避免嵌套函数中直接使用 this,建议先赋值给另一个变量,如,_this|that|self。
避免在内置对象(Array、String、Date等)的原型上添加方法
加空格
关键字 else、while、catch、finally 前
关键字 if、else、for、while、do、switch、case、try,catch、finally、with、return、typeof 后
单行注释 // 后,若单行注释和代码同行,则 // 前也需要;多行注释 * 后
for 循环:分号后留空格;前置条件如果有多个,逗号后留空格
采用一致的方法命名变量和函数可提高代码可预测性和可维护性。
驼峰式命名:第一个单词首字母小写,后面其他单词首字母大写。
匈牙利命名:前缀字母用变量类型的缩写,其余部分用变量的英文或英文的缩写,单词第一个字母大写。
普通函数:fn + 动词 + 名词形式。如:fnGetVersion()
内部函数:_fn + 动词 + 名词形式,内部函数必需在函数最后定义。如: _fnGetNumber
对象方法:fn + 对象类名 + 动词 + 名词形式。如: fnAddressGetEmail()
事件响应函数:fn + 触发事件对象名 + 事件名或者模块名。如:fnDivClick()
函数方法常用的动词:
大驼峰式命名
作用域不大临时变量可以简写。比如:str、num、bol、obj、fun、arr。
某些作为不允许修改值的变量认为是常量,全部字母都大写,单词以_分割。例如:COPYRIGHT、PI、AUTHOR_NAME。
运行工具来解析代码和注释(工具如:JsDoc Toolkit 和 YUIDoc);
发布工具解析的结果,大多数情况是采用 HTML 格式发布。
MDN - 严格模式arrow-up-right