5.ES5
ESMAScript第5个版本
5.1严格模式
定义:比旧的js运行机制要求更严格的新的运行机制
如何使用:在当前代码段的顶部添加 “use strict”;
新规定:4个
- 禁止给未声明过的变量赋值
1.在旧的js中,如果强行给未声明过的变量赋值,不会报错,而是自动在全局创建一个全局变量。——容易造成全局污染
2.严格模式下:强行给未声明过的变量赋值,会报错!——减少了因写错变量名造成的全局污染
- 静默失败升级为错误
1.静默失败:程序运行不成功,但也不报错。——极其不利于调试程序
2.严格模式:将绝大部分静默失败都升级为错误,并报错!
"use strict";
var eric={
eid:1001,
sname:"埃里克"
}
//公司规定,员工编号禁止修改
Object.defineProperty(eric,"eid",{
writable:false
})
//有人试图修改eric的eid属性
eric.eid=-2;//Uncaught TypeError: Cannot assign to read only property 'eid'
console.log(eric);
- 普通函数调用中的this不再指window,而是指undefined
1.旧的js中:普通函数调用中的this默认指window——极容易造成全局污染
2.严格模式:普通函数调用中的this指undefined,——防止因为错误使用this而导致的全局污染
"use strict";
function Student(sname,sage){
console.log(this);
this.sname=sname;//Cannot set property 'sname' of undefined
this.sage=sage;
}
var lilei=new Student("Li Lei",11)
//忘写new了!
var hmm=Student("Han Meimei",12);
// this->window
// this.sname->window.sname
// this.sage->window.sage
console.log(lilei);
console.log(hmm);
console.log(window);
- 禁用了arguments.callee
什么是arguments.callee:是在一个函数内,获得当前函数本身的一种特殊关键字——递归
递归的问题1:在函数内写死了当前函数名,一旦外部函数名改变,内部函数名忘记修改,则程序立刻报错!——紧耦合
解决:在函数内使用arguments.callee代替写死的函数名。在运行时,会自动获得当前函数本身——松耦合
递归的问题2:重复计算量太大:递归效率低
解决:如果递归调用是严重影响程序的性能时,就要用循环来代替递归
// "use strict";
//斐波那契数列:
//1 1 2 3 5 8 13 21 34 55
//1 2 3 4 5 6 7 8 9 10
//前两个数是都是1,
//从第三个数开始,每个数都是它相邻的前两个数的和
//数学:
//f(1)=1 f(2)=1
//f(n)=f(n-1)+f(n-2)
//计算斐波那契数列中第n个数是几
function f(n){
if(n<3){
return 1
}else{
return arguments.callee(n-1)+arguments.callee(n-2);
}
}
console.log(f(10));//55
总结:
i. 如果递归调用没有影响程序的效率,就首选递归——简单,直观
ii. 如果递归调用却是影响了程序的效率,则被迫改为循环实现——难度极高.