1、什么是闭包?闭包的作用?使用闭包需要注意的地方?
闭包:js中的作用域分为两种:局部作用域和全局作用域;内层作用域可以访问外层作用域中的变量,但是外层作用域不能访问内层作用域的变量;同样的,不同的函数作用域也不能访问彼此的变量;闭包就是解决此问题的。
闭包的三个特性:
(1)、两个函数嵌套
(2)、内部函数可以访问外部函数作用域的参数和变量
(3)、函数执行完毕后内部被引用的函数不会被垃圾回收机制回收
闭包的作用:
(1)、可以访问函数内部的变量
(2)、可以使变量始终保存在内存中
需注意的地方:
(1)、函数中的变量会被长久的保存在内存中,内存消耗很大,所以不能滥用闭包,,否则会造成网页的性能问题,造成内存泄漏;解决方法:在退出函数之前,清除不再使用的局部变量。
(2)、函数会在父函数外部改变父函数内部变量的值。所以,若把父函数当作对象使用,把闭包当成他的公有方法,把内部变量当作它的私有属性,这时要注意,不要随意改变父函数内部变量的值。
2、this
(1)、this指的是函数运行时所在的环境。函数运行在哪个环境,this就指向谁。
(2)、函数的运行环境到底是怎么决定的呢?
解释:javascript之所以有this的设计,主要取决于内存里面的数据结构。
a、对象的存储
var obj = { foo: 5 };
上面的这个代码是将一个对象赋值给obj。Javascript引擎会先在内存里面生成一个对象{ foo: 5 },然后把这个对象的内存地址(引用)复制给变量obj。所以实际上obj里面存的是一个地址,要读取的时候要先从obj那到底值再去找相对应的值。
b、函数
var obj = { foo: function( ) { } } ;
引擎会将函数单独保存在内存中,然后再将函数的地址赋值给foo属性的value属性。
c、环境变量
Javascript允许在函数体内部,引用当前环境的其他变量。
由于函数可在不同的运行环境中执行,所以需要有一种机制,能在函数体内部获得当前的运行环境。所以this的出来就是为了解决这个问题。它的设计目的就是在函数体内部,指代函数当前的运行环境。
this参考文档:http://www.ruanyifeng.com/blog/2018/06/javascript-this.html
仅发表个人观点和见解,若有不合理之处,欢迎各位指出共同进步~