#js--上下文、作用域、闭包、this

王福朋:js原型和闭包

慕课网:js深入浅出

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值