一 做用域,做用域链闭包
先上代码app
1 var scope="global"; 2 function t(){ 3 console.log(scope); 4 var scope="local" 5 console.log(scope); 6 } 7 t();
此时打印出来的 按顺序分别是undefine,local,为何第一个是undefined呢,摘抄下js做用域原话:函数
Javascript没有块级做用域,而是函数做用域.this
所谓函数做用域就是说:-》变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。spa
因此此段代码就能够解释为:code
var scope="global"; function t(){ var scope; console.log(scope); scope="local" console.log(scope); } t();
因此明显看出来第一句打印,只是从新声明了变量,而没有赋值对象
二 闭包与thisblog
在闭包中使用this对象会出现一些问题,this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被看成某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环境具备全局性,所以其this对象一般指向window(固然,在经过call()和apply()改变函数执行环境时,this指向其余对象)。ip
var name="The Window"; var object={ name:"My object", getNameFunc:function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()()); //"The Window"(在非严格模式下) 此时弹出 The Window
若是要改变,那么我本身的理解就是让闭包能 根据活动函数上下文找到 外部函数的变量,那么就把this从新赋值给一个变量内存
var name="The Window"; var object={ name:"My object", getNameFunc:function(){ var that = this; return function(){ return that.name; }; } }; alert(object.getNameFunc()()); //"The Window"(在非严格模式下) 此时弹出 My object
三 闭包的内存释放与执行规则
直接上代码
function fun03() { var a = 10; return function(){ a*= 2 ; return a ; }; } var f = fun03(); f(); var x = f(); console.log(x); //40 var g = fun03(); var y = g(); console.log(y); //20
为何第一句打印的是40,第二句打印20呢,目测看到的缘由是第一句打印 f()执行了两次(可是函数一旦执行后那么里面的局部变量就会销毁,可是为何没有被销毁呢,这就是闭包的做用)
由于闭包可使变量不被释放,始终存在内存中,由于fun03是其中匿名函数(闭包)的父函数,而匿名函数又被赋值给了一个全局变量,因此f一直在内存中,而f又依赖于fun03因此这就致使其中的a变量一直存在,当运行两次后a进行了累加计算