所谓严格模式其实就是一个不会赋值给任何变量的字符串 “use strict”
若是在全局做用域下 给出这个提示,那整个脚本将采用严格模式。也能够只在函数中打开严格模式windows
a="test"app
严格模式下会报错,非严格模式下正常函数
var 有三种声明的情形this
第一种和第二种状况是没法用 delete删掉的。
首先第一种状况声明的全局对象虽然是windows的属性,但这个属性的configurable=false 所以是没法删除的
第二种状况 局部变量更不行了,连依附的对象是谁都不知道,怎么删除code
第三种状况eval()稍后会说到。对象
回归正题。也就是说非严格模式下,能够删除变量,可是会失败返回false.
严格模式下删除变量会报错。作用域
在下列状况下操做对象会报错字符串
var person={ name:"1", name:"2" }
非严格模式下会默认取值第二个,严格模式下会报错。io
严格模式要求函数参数名称必须惟一console
function(n,n){ // todo }
在非严格模式下,这个函数声明不会报错,经过参数名只能访问到第二个参数,第一个参数得经过arguments去访问。
arguments在两种模式下也有所不一样
在非严格模式下,修改命名参数的值会反映到arguments对象中,在严格模式下两个值是独立的。
淘汰了 arguments.callee(引用函数自己),arguments.caller(引用调用函数)。
严格模式下函数名不能使用js保留字
**严格模式下只能在脚本的顶级和在函数内部声明函数,在if语句中声明函数会致使语法错误。
**
if(true){ function(){ // 严格模式下报错 } }
在非严格模式下使用函数的apply(),call(),传入null 或者undefined值会被转换为全局对象。在严格模式下,函数的this始终是指定的值,不管指定的是什么值。
var a="1"; function test(){ console.log(this.a) } test.call(null) 在非严格模式下会输出1,严格模式下this就指代的就是null,null没有a属性,就会报错。
一会回来补充点别的