严格模式和非严格模式的区别

发表于: 2015-10-10分类于:JavaScript
  • 在严格模式下,不能使用关键词 with
  • 在严格模式下,所有变量都必须使用 var 来声明。
  • 在严格模式下,函数调用中的 this 的值是 undefined ,而非严格模式下的 this 为全局对象。在使用 call 和 apply 进行函数调用的时候,在严格模式下 this 值就是传入的第一个参数,而在非严格模式下,第一个参数传入 undefined 和 null 会被替换成全局对象。若传入的不是对象,那么将会被转换为 {},而严格模式下,传入是的是什么就是什么。如传入:123 ,那么this 的值就是 123。
  • 在严格模式下,试图给不允许写入的变量赋值或者试图扩展一个不允许扩展的变量这都会导致错误,而在非严格模式下会被忽略。
  • 在严格模式下,在 eval 中定义的变量或者函数,不会添加到调用eval的作用域中,而是添加到一个为 eval 创建的作用域中,但函数退出时候,该作用域被销毁。
  • 在严格模式下,函数中的 arguments 中保存了函数参数的拷贝,不会有非严格模式下那样的行为:参数与arguments 是关联的。
  • 在严格模式下,试图用 delete 删除一个变量,会抛出异常,而不是像非严格模式那样,返回一个 false。
  • 在严格模式下,尝试删除不可配置的属性会导致错误,而在非严格模式下只是简单地返回一个 false
  • 在严格模式下,用对象字面量定义对象的时候,如果有多个属性的属性名相同,则会出现语法错误。在非严格模式下,没有错误发生。
  • 在严格模式下,函数不能有两个或多个相同的参数名,否则会有语法错误。而在非严格模式下,没有问题,只是在函数内部使用该参数时,参数的值是传入的最后一个相同参数位置上的值。
  • 在严格模式下,不允许使用以0开始的数字(不允许使用八进制字面量)
  • 在严格模式下,eval 和 arguments 被视为关键字,不能给其赋值,不能用作变量名,函数名。
  • 在严格模式下,函数中不能访问 callee 和 caller。