#闭包
##
简单来说 每个函数都可以访问其外围作用域中的所有变量
闭包是指一些函数通过某种方式 可以随时被访问 即使它的外部代码已经执行完毕
function A(){function b(){}}
在执行完毕A函数后还能执行b的方法:
- 将b传入setTimeout
- 在A中返回b
- 将b保存为某个全局变量
#this
This是一个标识符,它需要和值进行绑定,跟变量差不多,但是,在你的代码中,它并不是和某个具体的值进行绑定,而是自动绑定到正确的对象上。一般来说,参数究竟绑定在哪个对象上都是由定位函数参数规则决定的,而定位函数参数和“参数”this的区别则决定了你在调用方法或构造函数时对于谁才是真正绑定的对象的判断
,许多人在这方面的理解可以说相当混乱。
####我用一些不会被this绑定的例子来帮助自己理解。
1.
var fn=function(a,b){
log(this);
}
2.
var fn=function(a,b){
log(this);
}
var ob2={method: fn};
3.
var obj={
var fn=function(a,b){
log(this);
}
};
var ob2={method:obj.fn};
4.
var obj={
var fn=function(a,b){
log(this);
}
};
var ob2={method:obj.fn};
obj.fn(3,4);
像这几个例子,如果两个不同对象的属性对对应同一个函数,那么关键词this就会被强制在这两个对象中选择一个,这显然不合理。再进一步想,我们声明关键词this出现在函数中,并且这个函数必须出现在某个对象字面量的花括号中,或其它定义函数的形式中。这样,包含这个函数定义的对象字面量在内存中所创建的对象就由可能时关键词this指代的内容,这是错误的。
在最后一个例子里面,函数的调用中,函数是作为某个对象的属性被查找的,而.的左边是说明这个函数是在哪个对象中被查找的。在这个函数被调用时,它所查找的这个对象就是关键词this绑定的内容。这个情况下大多数都适用。
无论如何,存储某一个函数的对象,并不能被认为就是函数中关键词this所指代的内容,也不能认为this最初被定义的对象或函数,就是关键词this指代的内容。事实上,跟它相关的是调用时的点符号(.)以及点符号左边的对象。