JS 的严格模式
为什么使用严格模式?
消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为 "use strict" 指令只允许出现在脚本或函数的开头。
变量必须显示声明 (var/let/const)
不允许删除变量或对象或函数
"use strict" var x = 3.14 delete x // 报错 function x(p1, p2) {} delete x // 报错
函数的形参不能重名 不允许使用转义字符 不允许对只读属性赋值
'use strict' var obj = {} Object.defineProperty(obj, 'x', { value: 0, writable: false }) obj.x = 3.14 // 报错
不允许对一个使用 getter 方法读取的属性进行赋值
"use strict"
var obj = { get x() { return 0 } }
obj.x = 3.14 // 报错
arguments 和 eval 是关键字,不能被修改,不能做变量处理
JS 中作用域有两种,全局作用域和函数作用域。严格模式带来了第三种作用域:eval 作用域,在作用域 eval() 创建的变量不能被调用
禁止 this 关键字指向全局对象。
为了向将来 Javascript 的新版本过渡,严格模式新增了一些保留关键字:
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
禁止使用 func.arguments (返回调用时函数的参数) 和 func.caller (返回调用当前函数的那个函数)
ES6 的严格模式
只要函数参数使用了默认值、解构赋值、或者扩展运算符,那么函数内部就不能显式设定为严格模式,否则会报错。
// 报错
function doSomething(a, b = a) {
'use strict'
// code
}
这样规定的原因是,函数内部的严格模式,同时适用于函数体和函数参数。但是,函数执行的时候,先执行函数参数,然后再执行函数体。
这样就有一个不合理的地方,只有从函数体之中,才能知道参数是否应该以严格模式执行,但是参数却应该先于函数体执行。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: JS this 指向问题
下一篇: TypeScript 常见问题
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论