"use strict" 严格模式和非严格模式的区别

ECMAScript 5中的严格模式(“use strict”)修正了语言的重要缺陷,并提供健壮的查错功能和增强的安全机制。
严格模式和非严格模式的区别如下(前三条尤为重要)

  • 在严格模式中禁止使用with语句(临时添加对象到作用域链的头部)
  • 在严格模式中,所有的变量都要先声明,如果给一个未声明的变量赋值,将会抛出引用错误异常(在非严格模式中,将会隐式声明一个全局变量)。
  • 在严格模式中,函数(不是方法,方法是赋值给对象属性的函数)中的this值是undefined。(在非严格模式中,函数中的this值总是全局对象,在浏览器中是window对象)。可以利用这种特性来判断JavaScript实现是否支持严格模式:
var hasStrictMode = (function(){"use strict"; return this === undefined})()
console.log(hasStriceMode) // true支持严格模式,false不支持

注意:此处使用立即执行函数,只是为了返回结果。下面说明函数和方法的区别

// 函数
var hasStrictMode = function(){
	"use strict";
	return this
}
console.log(hasStrictMode()) // undefined

// 方法
var obj = {
	hasStrictMode: hasStrictMode 
}
console.log(obj.hasStrictMode()) // {hasStrictMode: f}
  • 在严格模式中,当通过call()或apply()调用函数时,函数体中的this就是通过call()或apply()传入的第一个参数(在非严格模式中,null和undefined值被全局对象和转换为对象的非对象值所代替):
// 严格模式
var test = function(){
	"use strict";
	return this;
}
test.call(undefined); // undefined
test.call(null); // null
test.apply(undefined); // undefined
test.apply(null); // null

// 非严格模式
var test2 = function(){
	return this;
}
test2.call(null); // Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}
test2.apply(undefined); // Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}
  • 在严格模式中,给只读属性赋值和给不可扩展的对象创建新成员都将抛出一个类型错误异常(在非严格模式中,这些操作只是简单地操作失败,不会报错)。
  • 在严格模式中,传入eval()的代码不能在调用程序所在的上下文中声明变量或定义函数,而在非严格模式中可以(变量和函数的定义是在eval()创建的新作用域中,这个作用域在eval()返回时就会被弃用)。
  • 在严格模式中,函数里的arguments对象拥有传入函数值的静态副本。在非严格模式中,arguments对象里的元素和函数参数都是指向同一个值的引用。
  • 在严格模式中,delete运算符后跟随非法的标识符(比如变量、函数、函数参数)时,会抛出一个语法错误异常(在非严格模式中,这种delete表达式什么也没做,并返回false)。
  • 在严格模式中,delete表达式试图删除一个不可配置的属性时将抛出一个类型错误异常(在非严格模式中,delete表达式操作失败,并返回false)。
  • 在严格模式中,在一个对象直接量中定义两个或多个同名属性将产生一个语法错误(在非严格模式中不会报错)。
  • 在严格模式中,函数声明中存在两个或多个同名的参数将产生一个语法错误(在非严格模式中不会报错)。
  • 在严格模式中不允许使用八进制整数直接量(以0位前缀,注意不是0x为前缀)(在非严格模式中某些实现允许)。
  • 在严格模式中,标识符eval和arguments是关键字,不能给它们赋值,也不能把它们声明为变量、用做函数名、用做函数参数或用做catch块的标识符。
  • 在严格模式中,限制了对调用栈的检测能力。在严格模式的函数中,arguments.caller和arguments.callee都会抛出一个类型引用错误异常。严格模式的函数具有caller和arguments属性,当访问这两个属性时将会抛出类型错误异常(在非严格模式中,有一些JavaScript的实现定义了这些属性,这些属性是非标准的)。

你可能感兴趣的:(JavaScript重点基础)