一、严格模式
ES5的严格模式是采用具有限制性JavaScript变体的一种防止,即在严格模式下运行JS代码
1、消除了Javascript语法的一些不合理、不严谨之处,减少了一些诡异行为
2、消除了代码运行的一些不安全之处,保证到吗运行的安全
3、提高编译器效率,增加运行速度
4、禁用了子啊ECMAScript的版本中未来可能定义的一些语法,为未来新版本Javascript做好铺垫比如一些保留字如:class,enum,export, extends, import, super 不能做变量名
开启严格模式
开启严格模式有两种方式:
情况一、为脚本开启严格模式
<script>
"use strict";//为当前script标签开启严格模式
</script>
<script>
//当前script标签未开启严格模式
</script>
情况二、为函数开启严格模式
使用”use strict“在函数体中声明
function fun(){
"use strict";
return 123;
}
严格模式中的变化
'use strict'
num = 10
console.log(num)//严格模式后使用未声明的变量
--------------------------------------------------------------------------------
var num2 = 1;
delete num2;//严格模式不允许删除变量
--------------------------------------------------------------------------------
function fn() {
console.log(this); // 严格模式下全局作用域中函数中的 this 是 undefined
}
fn();
---------------------------------------------------------------------------------
function Person() {
this.sex = '男';
}
// Person();严格模式下,如果 构造函数不加new调用, this 指向的是undefined 如果给他赋值则 会报错.
var p1 = new Person();
console.log(p1.sex);
----------------------------------------------------------------------------------
setTimeout(function() {
console.log(this); //严格模式下,定时器 this 还是指向 window
}, 2000);
----------------------------------------------------------------------------------
// 严格模式下,函数里的参数不允许重名
function fun1(num, num) {
console.log(num + num);
};
fun1(2, 3);
二、高阶函数
高阶函数是对其他函数进行操作的函数,换句话说就是:函数作为参数进行传递或函数作为返回值返回。
函数作为参数:
function fn(callback){
callback&&callback();
}
fn(function(){
alert("Hi")
})
函数作为返回值:
// 函数作为参数
function fun(fun) {
console.log(fun);
// 函数作为返回值
return fun2(10,20);
}
function fun2(num1, num2) {
return num1 + num2;
}
var rel = fun(fun2);
console.log(rel);
三、闭包
我们不会可以去写闭包,但是我们却在不经意间使用闭包
闭包指:在互相嵌套的函数中,内层函数访问外层函数的参数或变量形成的词法环境就叫闭包
闭包的作用:延申变量的作用范围
function fun(){
var num=10;
function fun2(){
console.log(num);
}
return num;
}
var rel=fun();
闭包的三个特种:
1、函数相互嵌套
2、函数内部访问外部函数的参数或变量
3、可以是函数长期驻扎在内存中
闭包的好处:
1、可以使变量长期驻扎在内存中
2、避免全局变量被污染
3、私有成员的存在
闭包的坏处:
1、变量长期驻扎在内存中
2、会增大内存的使用情况
3、使用不当会造成内存泄露
四、递归
递归简单说就是函数 自己调用自己
注意:递归函数的作用和村换效果一样,由于递归和循环一样很容易就会发生栈溢出错误所以必须要加推出语句return
使用递归求阶层
function fun(n){
if(n==1){
return 1
}
return n*fun(n-1);
}
console.log(fun(4));
五、深拷贝和浅拷贝
浅拷贝:
拷贝出来的目标对象的地址和源对象的内存地址的内存空间是同一块,这就会导致他们联动
Object.assign()实现浅拷贝
Object.assign(targrt,sources);
target目标对象,sources:源对象
返回值:返回目标值
深拷贝
克隆出一个对象,数据相同
但是内存地址不同
方法一:递归赋值对象
// 封装函数
function deepCopy(newobj, oldobj) {
for (var k in oldobj) {
// 判断我们的属性值属于那种数据类型
// 1. 获取属性值 oldobj[k]
var item = oldobj[k];
// 2. 判断这个值是否是数组
if (item instanceof Array) {
newobj[k] = [];
deepCopy(newobj[k], item)
} else if (item instanceof Object) {
// 3. 判断这个值是否是对象
newobj[k] = {};
deepCopy(newobj[k], item)
} else {
// 4. 属于简单数据类型
newobj[k] = item;
}
}
};
方法二:使用JSON方法
JSON.parse(JSON.stringify(obj))