JavaScript红宝书 - 更新中
  • JavaScript 高级程序设计
  • 章节内容
    • 1. JavaScript 简介
    • 2. 在 HTML 中使用 JavaScript
    • 3. JavaScript 基本概念
    • 4. 变量、作用域和内存问题
    • 5. 引用类型
    • 6. 面向对象的程序设计
    • 7. 函数表达式
    • 8. BOM
    • 9. 客户端检测
    • 10. DOM
    • 11. DOM 扩展
    • 12. DOM2 和 DOM3
    • 13. 事件
    • 14. 表单脚本
    • 15. 使用 Canvas 绘图
    • 16. HTML5 脚本编程
    • 17. 错误处理与调试
    • 18. JavaScript 与 XML
    • 19. E4X
    • 20. JSON
    • 21. Ajax 与 Comet
    • 22. 高级技巧
    • 23. 离线应用与客户端存储
    • 24. 最佳实践
    • 25. 新兴的 API
  • 数据类型
    • Undefined
    • Null
    • Boolean
    • Number
    • String
    • Object
  • 引用类型
    • Array
    • Object
    • Function
    • Date
    • RegExp
    • 基本包装类型
    • 单体内置对象
  • 专项练习
    • 操作符
    • 语句
    • 数组
    • 函数
  • 附录
    • 操作符特殊规则
    • 严格模式规则
    • 兼容性汇总
Powered by GitBook
On this page
  • 变量声明
  • Number类型
  • 语句
  • 函数
  • 对象
  • Global对象

Was this helpful?

  1. 附录

严格模式规则

变量声明

  • 部分保留字不能作为标识符和属性名;eg.不能定义名为 eval 或 arguments 的变量,否则会导致语法错误;

  • 给未经声明的变量赋值在严格模式下会导致抛出 ReferenceError 错误; 初始化未经声明的变量会导致错误;

  • 对于尚未声明过的变量,只能执行一项操作,即使用 typeof 操作符检测其数据类型(对未经声明的变量调用 delete 不会导致错误,但这样做没什么实际意义,而且在严格模式下确实会导致错误);

Number类型

  • 八进制字面量在严格模式下是无效的,会导致支持的 JavaScript 引擎抛出错误 ;

语句

  • 严格模式下不允许使用 with 语句,否则将视为语法错误 ;

函数

  • 严格模式对函数限制除了参数名和函数名外,不能出现两个命名参数同名的情况 ,否则会语法错误;

  • 严格模式对如何使用 arguments 对象做出了一些限制。首先,像前面例子中那样的赋值会变得无效。也就是说,即使把 arguments[1] 设置为 10, num2 的值仍然还是 undefined。其次,重写 arguments 的值会导致语法错误(代码将不会执行);

  •  function doAdd(num1, num2) {
      arguments[1] = 10;
      alert(arguments[0] + num2);
     }
  • 严格模式下,argunments.callee 会导致错误,非严格模式下,ES5还定义了 arguments.caller 属性,在严格模式下访问会导致错误,非严格模式下这个属性始终是 undefined,定义该属性是为了区分函数的 caller 属性和 arguments.caller;

  • 严格模式下,不能为 caller 属性赋值,否则会导致错误;

  • setTimeout 都是在全局作用域中执行的,因此函数中 this 的值在非严格模式下指向 window 对象,在严格模式下是 undefined ;(虽然有不少的书上这么写,经测试,在严格模式下,setTimeout() 的回调函数里面的 this 仍然默认指向 window对象,并不是undefined)

    function foo() {
      setTimeout(function(){
        console.log('id',this.id)
      },100)
    }
    var id = 21;
    foo.call({'id': 42})

对象

  • 对象的只读属性(writable: false)是不可修改的,如果尝试为它指定新值,则在非严格模式下,赋值操作将被忽略;在严格模式下,赋值操作将会导致抛出错误;

  • 把对象属性的 configurable 特性设置为 false,表示不能从对象中删除属性。如果对这个属性调用 delete,则在非严格模式下什么也不会发生,而在严格模式下会导致错误;

  • 访问器属性只指定 getter函数 意味着属性是不能写,尝试写入属性会被忽略。 在严格模式下,尝试写入会抛出错误。只指定 setter 也不能读,在非严格模式下会返回 undefined,在严格模式下会抛出错误;

Global对象

  • 严格模式下,在外部访问不到 eval() 中创建的任何变量或函数,为 eval 赋值也会导致错误;

Previous操作符特殊规则Next兼容性汇总

Last updated 4 years ago

Was this helpful?