起源

image.png

  1. // "use strict"
  2. var message = "Hello World"
  3. console.log(message)
  4. // 严格模式下报错
  5. // true.foo = "abc"
  6. // name="abc"

image.png

开启

image.png
image.png (JS文件中,写在最上面一行)
image.png(某个函数中开启)

另外,一般打包工具(webpack、vite、vuecli等等)都会打包好后开启严格模式

严格模式限制

image.png

  1. "use strict"
  2. // ====================== 1. 禁止意外创建全局变量 ======================
  3. message = "Hello World" // X
  4. console.log(message)
  5. function foo() {
  6. age = 20 // X,创建了全局的变量
  7. }
  8. foo()
  9. console.log(age) // X
  10. // ====================== 2.不允许函数有相同的参数名称 ======================
  11. function foo(x, y, x) { // X
  12. console.log(x, y, x)
  13. }
  14. foo(10, 20, 30)
  15. // ====================== 3.静默错误 ======================
  16. true.name = "abc" // X
  17. NaN = 123 // X
  18. var obj = {}
  19. Object.defineProperty(obj, "name", {
  20. configurable: false, // 是否可以配置,比如是否可以删除
  21. writable: false, // 是否能修改
  22. value: "why"
  23. })
  24. console.log(obj.name)
  25. obj.name = "kobe"// X
  26. delete obj.name // X
  27. // ====================== 4.不允许使用原先的八进制格式 0123 ======================
  28. var num0 = 0123 // 八进制,不可以
  29. var num = 0o123 // 八进制,可以
  30. var num2 = 0x123 // 十六进制,可以
  31. var num3 = 0b100 // 二进制,可以
  32. console.log(num, num2, num3)
  33. // ====================== 5.with语句不允许使用 ======================
  34. var obj1 = {message:"abc"}
  35. with(obj1) { // 给里面的代码一个作用域obj
  36. console.log(message)
  37. }
  38. // ====================== 6.eval函数不会向上引用变量了 ======================
  39. var jsString = '"use strict"; var message = "Hello World"; console.log(message);'
  40. eval(jsString)
  41. console.log(message) // X
  42. // ====================== 7.this绑定不会默认转成对象 ======================
  43. // 在严格模式下, 自执行函数(默认绑定)会指向undefined
  44. // 之前编写的代码中, 自执行函数我们是没有使用过this直接去引用window
  45. function foo() {
  46. console.log(this)
  47. }
  48. var obj = {
  49. name: "why",
  50. foo: foo
  51. }
  52. foo() // undefined
  53. obj.foo() // obj
  54. var bar = obj.foo
  55. bar() // undefined
  56. // setTimeout的this
  57. // fn.apply(this = window)
  58. setTimeout(function() {
  59. console.log(this) // window
  60. }, 1000);

setTimeout的this是特殊的,源码可能是如下实现的,this绑定的都是一个window对象:
image.png