1.this 中的指向
判断this的指向(1-4优先级逐级递减,1优先级最高,4优先级最低):
1、函数被new调用,this指向由new新构造出来的这个对象;
2、函数通过call()、apply()、bind()调用,this指向被绑定的对象;
3、函数作为方法被调用,this指向这个对象(即常说的对象上下文);
4、默认(非严格模式)情况下,this指向window, 严格模式下,this指向undefined
this.x=9;
var model= {
x:81,
getX:function(){
return this.x;
}
}
model.getX(); //81 调用对象的方法
var getterX=model.getX; 创建对象实例
getterX(); //9 this指向全局变量
var boundgetX=getterX.bind(model); 通过bind将this绑定到model对象中
boundgetX();//81
2、作用域、执行上下文
作用域:区域(全局变量和局部变量),在函数创建时候就建立了,而不是函数调用的时候
执行上下文(execution context): 跟踪代码的运行情况。
图片引自:https://blog.csdn.net/iamchuancey/article/details/78236839;
函数b()中:第一个age为undefined: 函数b() 中创建上下文时,age变量声明提升,未赋值
第一个height为178: 函数b() 创建上下文中没有height的值,根据作用域链,往上查找,找到a()中的height=178
第二个age为25,第二个height为180: 运行赋值语句,函数b() 中的作用域得到两者的值
3、闭包
执行17行代码:创建fn() 的上下文环境,max在该作用域下赋值为10;
执行18行代码: 全局上下文下的max为100;
执行20行代码: 调用bar() 函数,x赋值为15;而max根据作用域为10;
闭包: 使外部变量访问到一个函数的内部变量是闭包的形式,使变量保存在内存中是闭包的工作原理。
代码执行前生成全局上下文:A:function(); c:undefined.
执行20行代码:调用A() 产生A的执行上下文,c赋值为函数A;"return"把函数A()、B()的上下文联系在一起,为了B() 的上下文,不能把A() 的上下文删除,A() 的上下文环境存在执行环境中。
执行21行:执行函数B() 根据作用域链,在A() 的上下文中找到count的值,所以为1