标签:闭包 set 函数 对象 var 箭头 test 变量
闭包写法
//后台每个执行环境都有一个表示变量的对象---变量对象
//例如compare()函数调用
//compare的执行环境而言,其作用域链包含两个变量对象
- 本地活动对象
- 全局活动对象
全局变量对象始终存在,compare()函数只在函数执行过程中存在
作用域链:一个指向变量对象的指针列表,只引用
//
定义:闭包有权访问另一个函数作用域中的变量的函数
//内部定义。然后返回 test = { a:"test", set:function () { var a = "set" function f() { var a = "f" } return f } } 直接返回一个函数 test = { a:"test", set:function () { var a = "set" return f() { var a = "f" } } }
此处一般返回匿名函数
闭包有两种写法 没有区别(暂定没有区别)
闭包两个问题
- 内存泄漏:由于作用域链的存在,匿名函数执行完,其包含函数的活动对象不会立即销毁 解决方案:解除引用
- 闭包只能取得函数中任何变量的最后一个值
this对象
this对象是在运行时基于函数的执行环境绑定的
- 全局中,this等于window
- 当被作为某个对象的方法调用时,this等于那个对象
匿名函数的执行环境具有全局性,因此其this对象通常指向window
每个函数在被调用的时候自动取得两个特殊变量,this和arguments(若调用者内部没有this.变量的值,则返回undefined)。内部函数搜索这两个变量时,只会搜索到其活动对象为止。因此永远不会访问外部函数中这两个变量。不过可以把外部的this对象保存在一个闭包能访问的变量中 that = this
特殊1 //函数作为函数调用和函数作为方法调用是有区别的 //匿名函数的执行环境具有全局性
var a = "windows" test = { a:"test", set:function () { var a = "set" function f() { var a = "f" console.log(this,this.a) } return f } } test.set()() //windows 指向全局
特殊2:箭头函数中的this指向定义函数时候所处的对象
//由于箭头函数没有this指向,所以不能用call apply bind
//箭头函数是继承而来
//所以只会从自己的作用域链一层一层向上找
var a = "windows" test = { a:"test", set:() => { var a = "set" var f = () => { var a = "f" console.log(this,this.a) } return f } } test.set()() //windows
一层一层往上找
var a = "windows" test = { a:"test", set:function () { var a = "set" var f = () => { var a = "f" console.log(this,this.a) } return f } } test.set()() //test
标签:闭包,set,函数,对象,var,箭头,test,变量 来源: https://www.cnblogs.com/-constructor/p/11905131.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。