呜呜呜呜
严格模式:
不允许有with
所有变量必须声明,赋值给为声明的变量报错,而不是隐约创建全局变量。
eval中的代码不能 创建eval所在作用域下的变量、函数。而是为eval单独创建一个作用域,并在eval返回是丢失。
函数中的特殊对象argument是静态副本,而不像非常严格模式 那样,修改argument或修改参数变量会相互影响。
删除configurable=false的属性是报错,而不是忽略
禁止八进制字面量,如010(八进制的8)
eval,argument变为关键字,不可作为变量名、函数名等
一般调用时(不是对象的方法调用,也不使用apply、call、bind等修改this)this指向null,而不是全局对象。
若使用apply、call,当传入null或undefined时,this将指向null或UN的fined,而不是全局对象。
试图修改不可写属性(writable=false),在不可扩展的对象上添加属性时报TypeEttor,而不是忽略。
argument.caller,argument.callee被禁用
js特殊运算符:
条件运算符 c?a:b
逗号运算符 a,b
delete delete obj.x
in "document' in window
instanceof obj instanceof Func
new new ClsName()
this return this;
typeof typeof 100
void void()
js常用语句
1、块 block 块语句常用于0~多个语句,快语句用一对花括号定义
语法:
{
语句1;
语句2;
}
2、声明语句:
var a = 1
3、try catch 异常捕获
4、switch
5、with
var form = document.forms[0];
console.log(form.name.value);
严格模式下,传入的如果是对象,argument是会影响到形参,但不是对象的话就不会
严格模式总结
严格模式下修改arguments不会影响形参(对象除外,参数是对象的话还是会影响),非严格模式下传入的参数不为空时会受到arguments的影响
严格模式..
严格模式特点
1. 不允许用with
2. 不允许未声明的变量被赋值
3. arguments变为参数的静态副本
4. delete参数、函数名报错
5. delete不可配置的属性报错
6. 对象字面量重复属性名报错
7. 禁止八进制字面量
8. eval,arguments变为关键字,不能作为变量和函数名
9. eval独立作用域
......
"use strict"严格模式
严格模式 arguments变为参数的静态副本
严格模式 不允许未声明的变量被赋值
严格模式特点
严格模式‘use strict’:
①不允许用with
②不允许未声明的变量被赋值
③arguments变为参数的静态副本
④delete参数、函数名报错
⑤delete不可配置的属性报错
⑥对象字面量重复属性名报错
⑦禁止八进制字面量
⑧eval/arguments变为关键字,不能作为变量/函数名
⑨eval独立作用域
严格模式的特点:
非严格模式下,同一个属性可以定义多个,后面的覆盖前面的。
普通模式下 支持 八进制:0123 数值83
严格模式下 不支持。
'use strict' 代码严格模式,不支持 with语法,变量必须先申明再使用。
严格模式下的区别
严格模式下arguments为副本不会影响a;
严格模式下arguments对象会影响a的对象
开启严格模式
严格模式的特点
在一般模式下,如果在eval里面定义一个evalVal这样的变量的话,那么实际是eval所在的函数内部仍然可以拿到这个evalVal。
而在严格模式下,eval的代码会在一个独立的作用域中执行,所以在这里拿evalVal是拿不到的
严格模式下,eval、arguments变为关键字,不能作为变量、函数名,如果这样做的话会报'SyntaxError'
一般模式下可以用‘0123’来表示一个八进制的值,实际输出的是83.
在严格模式下是不允许这样的八进制的,如果这样写的话就会报'SyntaxError'语法错误。
一般模式下,我们可以在对象的属性字面量去重复地写属性,这样是合法的,并且属性以最后一个为准,所以这里obj.x的值为2。
但是这样重复属性名的方式在严格模式下是不允许的,所以会报'SyntaxError'语法错误。
严格模式下delete不可配置的属性报错'TypeError'
在一般模式下,如果想把一个参数用delete,那么实际上这样做没有什么意义,会返回一个false并且删除不成功,但是也不会报错。
如果在严格模式下试图delete参数或者函数名的话都会报一个‘SyntaxError’语法错误。
在一般模式下,如果我定义了一个函数,然后我调用它并且传参,那么这里的a和arguments[0]是有相互的一个绑定关系的。也就是在这里修改arguments[0]为100,那么这里的形参a也会修改为100。但是如果a没有传参,那么a就是undefined,不管arguments[0]修改为多少,a还是undefined,不会受arguments所影响。
在严格模式下,arguments已经变为参数的静态副本,不管参数a传还是没有传,都不会对arguments相互影响,所在这里console.log(a)结果都是1。
虽然形参a和arguments是没有相互绑定关系的,但是如果传入了一个对象的话,由于JS中是按照共享传递的所以这里面虽然说变量a不会受arguments影响,但是如果参数是对象的话,修改这个对象的属性,仍然是会相互影响的。