1.闭包
闭包是一种代码形式,在代码上的体现就是:内部函数访问外部函数的局部变量。
闭包的代码形式:
1个函数包含另1个函数,里面函数访问外面函数中的局部变量。
再将内部这个子函数return 出来。例:
function outer(){ let num = 10 function inner(){ console.log(num); } return inner } // 调用 outer 返回内部的inner函数,fn 就是 inner 函数 let fn = outer() // fn() 就是在 inner 函数 fn();
闭包的作用:
1.延长变量的生命周期2.提供有限制的操作
3.声明私有属性
闭包的使用:
需要先调用外部函数来得到内部函数闭包的注意事项:
因为:
外部函数每次调用都会创建不同的作用域,
不同的作用域内创建不同的局部变量、创建不同的内部函数、
返回的也是不同的内部函数、
每次再调用接收到的返回函数,操作都是各自作用域内的局部变量。
所以要注意:
出自同一次外部函数调用,而得到的内部函数,在多次调用时操作的是同一个局部变量。
如果不是同一次外部函数调用,而得到的内部函数,每次调用操作的就不是同一个局部变量。
2.递归
一个函数在内部再调用自己就是递归,作用就是循环执行某一段代码。
递归的执行过程:
浅拷贝与深拷贝
什么是拷贝:拷贝是对数据一种常见操作的一个称呼。拷贝可以简单直接的理解为赋值。
<script> // 拷贝的目的是为了得到两份相同的数据,拷贝后的两份数据不相互影响。 // a中保存一份数据 let a = 10; // 通过简单的赋值,b中得到了相同的一份数据 let b = a; // a与b不相互影响 b = 20 console.log(a,b); </script>
简单数据类型不区分浅拷贝和深拷贝,只有复杂数据类型都涉及浅拷贝和深拷贝
浅拷贝:
<script> let a = { title:'手机', price:2000 } // 此步操作时,由于a保存的是对象,所以是将对象的内存在址赋值给b // 这种操作就是浅拷贝 let b = a // 由于a与b中保存的是同一个对象的地址,所以修改其中的一个影响另一个 b.title = '手电' console.log(a); console.log(b); </script>
深拷贝:
<script> let a = { title:'手机', price:2000 } // 先在b中保存另一个空对象 let b = {} // 选取a对象的每一个具体的属性值,添加到b对象上 // b.title = a.title // b.price = a.price // 调用Object.assign语法简化上面对属性的赋值 Object.assign(b, a) b.title = '手电' console.log(a); console.log(b); </script>
Object.assign(target, source)仅仅是简化了赋值操作,不需要一个个属性读取再赋值。
假如源对象的属性值是一个对象的引用,那么它也只指向那个引,所以Object.assign()还是浅拷贝