目录
9.不能使用callee和caller,一个指向函数自身,一个指向调用函数的函数
10.在严格模式下,修正函数内部this的指向.函数的内部this始终是你指定的值
JavaScript严格模式说明
在JS开发中,有严格模式和非严格模式,默认是非严格模式
严格模式:在严格模式下会做更加严格的语法检查,有些在非严格模式下可以使用的代码在严格模式会直接报错或者抛出异常.
开启严格模式:"use strict"
这种语法做了向后兼容处理,支持严格模式的引擎会开启严格模式,不支持会作为一个普通的字符串处理
<script>
"use strict"; // 开启严格模式
</script>
严格模式注意点:
1.必须使用var关键字声明变量
<script>
"use strict";
// 1.在非严格模式下,未使用var声明的变量是全局变量,会自动成为 window的属性
// 在严格模式下,必需要使用var声明变量.
a = 10;
console.log(a);
//没使用的全部报错
</script>
2.在严格模式下,使用delete删除全局变量会直接报错
<script>
"use strict";
var a = 10;
console.log(delete a); // false->删除失败 (静默错误)
console.log(a);
</script>
3.对象不能存在同名的属性
<script>
"use strict";
var obj = {
name : 'zs',
age : 20,
name : 'ls'
}
console.log(obj.name);//在非严格模式中,属性同名,后属性会覆盖前属性
</script>
4.函数的形参必须唯一(不能出现同名的参数)
<script>
"use strict";
function fun(a,b,a) {
console.log(a + b + a);
}
fun(1,2,3);
</script>
5.禁止使用with语句
<script>
"use strict";
var obj = {
name : 'zs'
}
with(obj){
name = 'ls';
}
console.log(obj.name);
</script>
6.不能使用eval和arguments作用标识符
<script>
"use strict";
var eval = 15;
console.log(eval);
var arguments = 20;
console.log(arguments);
</script>
7.禁止使用八进制
<script>
"use strict";
var a = 020;
var b = 017;
var c = 028;
console.log(b);
</script>
8.在if语句中不能声明函数
<script>
"use strict";
if(true){
function demo() {
console.log('demo');
}
}
demo();
</script>
9.不能使用callee和caller,一个指向函数自身,一个指向调用函数的函数
<script>
"use strict";
function f1() {
console.log(arguments.callee); // f1
console.log(f1.caller); // f2
}
function f2() {
f1();
}
f2();
</script>
10.在严格模式下,修正函数内部this的指向.函数的内部this始终是你指定的值
<script>
"use strict";
var obj = {
name : '小明',
log : function () {
console.log(this);
}
}
obj.log();// this-->obj
var log = obj.log;
log(); // this->window | undefined
obj.log.call(null); // null
</script>
11.在严格模式下,arguments的使用有区别
<script>
"use strict";
// 在非严格模式下,形参和arguments共享同一份数据
// 在严格模式下,形参和arguments是独立的
function test(a) {
console.log(a); // 10
a = 20;
console.log(a); // 20
console.log(arguments[0]); // 10
}
var b = 10;
test(b);
</script>
严格模式的书写格式:双引号和单引号都可以
- 双引号和单引号都可以
- 分号可以省略
- 都是小写,并且只有10个字符
<script>
// "use strict"; // 正确
// "Use Strict"; // 错误
// "Use strict"; // 错误
// "use Strict"; // 错误
// "use strict "; // 错误
// "use strict"; // 错误
// "usestrict"; // 错误
// 'use strict'; // 正确
// "use strict" // 正确
</script>
严格模式的作用域
1."use strict"要写在当前作用域的顶端
2.
script标签的顶部:对当前的整一个标签内有效果
函数的顶部 :对当前这个函数内部有效果