ES5
- 严格模式
-
概念:比普通js运行机制要求更严格的新运行机制
-
启用严格模式:在当前作用域的顶部:
"use strict"
-
新要求:
(1)禁止给为声明过的变量赋值
(2)静默失败升级为错误:旧js中,执行不成功但不报错,在严格模式下,会报错
(3)普通函数调用中的this不再指向window,而是指向undefined
若函数调用时,前边既没有.也没有new,则函数中的this改为指向undefined
(4)禁用了arguments.callee
概念:arguments.callee:在调用函数时,函数内部自动获取当前函数本身的关键词
原因:arguments.callee解决了递归调用中的紧耦合问题,但因为递归算法本身存在大量重复的计算,效率极低,所以arguments.callee被禁用。
解决:绝大多数的递归都使用循环来代替
-
使用arguments.callee实现斐波那契数列
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
"use strict";
//斐波那契数列:
//1 1 2 3 5 8 13 21 34 55
//1 2 3 4 5 6 7 8 9 10
//前两个数都是1
//从第三个数开始: 每个数都是相邻的前两个数的和
//定义函数,计算出数列中第n个数是几?
function fib(n){
//如果n<3,直接返回1
if(n<3){
return 1
}else{
//从第三个数开始: 每个数都是相邻的前两个数的和
//n位置的数=n-1位置的数+n-2位置的数
//所以,想算出fib(n),必须先算出fib(n-1)和fib(n-2)
return arguments.callee(n-1)+arguments.callee(n-2)
}
}
console.log(fib(10))//55
</script>
</body>
</html>
运行结果:
Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
at fib (7_use_strict4.html:25)
at 7_use_strict4.html:28
因为禁用arguments.callee所以报错
-
保护对象
专门保护对象的属性和结构的机制- 保护属性
(1)每个属性底层都是一个缩微的对象
(2)获得属性底层的对象结构:var 变量名 = Object.getOwnPropertyDescriptor(对象名,"属性名")
举例:获取eric对象
- 保护属性
var eric={
name:"ysx",
age:25,
hobby:"演戏"
}
var eric = Object.getOwnPropertyDescriptor(eric,"name");
console.log(eric);
(3)修改一个属性中的开关Object.defineProperty(对象名,"属性名",{开关名:true/false, ... : ... , })
属性底层结构放大:
name