精简总结一下阮大神的文章,严格模式下:
- "use strict" 必须是当前作用域(全局作用域或者函数作用域)中第一句实际运行的语句,否则当前作用域内不会被严格模式所约束
- 当需要多个js合并成一个时,要使用严格模式,最好是使用 IIFE
- 变量必须声明后再使用
- 禁止使用with语句
- eval中语句的执行环境属于第三种作用域,拥有自己的作用域
- 全局环境中的this指向undefined
- 严格模式下的函数作用域内,禁止使用函数对象的caller和arguments属性,也禁止使用arguments.callee
- 只有configurable设置为true的对象属性,才能被删除
- 不符合语义的操作会被拒绝、显式报错
- 不允许重名属性名、函数形参名
- 禁止以0开头来表示8进制数
- 不允许使用arguments来当变量名、arguments不再追踪参数的变化。以下代码在 非严格模式下,输出 999
"use strict" function f(a){ arguments[0] = 999; console.log(a) } f(1) // 1
- 只允许在全局作用域或函数作用域的顶层声明函数【因为块作用域还没出现,所以这一条约束在当前来说,没起什么作用和影响】
Caller和Callee
如果一个函数f
是在全局作用域内被调用的,则f.caller为
null
,相反,如果一个函数是在另外一个函数作用域内被调用的,则f.caller指向调用它的那个函数对象
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments/callee