JS 的严格模式

发布于 2025-02-26 00:54:30 字数 1292 浏览 2 评论 0

为什么使用严格模式?

消除 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

无声情话

暂无简介

文章
评论
26 人气
更多

推荐作者

闻呓

文章 0 评论 0

深府石板幽径

文章 0 评论 0

mabiao

文章 0 评论 0

枕花眠

文章 0 评论 0

qq_CrTt6n

文章 0 评论 0

红颜悴

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文