浅谈JavaScript的this对象和[[scope]]

this对象

this引用的是函数据以执行的环境对象,即当前函数的所有者对象(执行空间),取值有两种可能

  1. 当在网页的全局作用域中调用函数时,this 对象引用的就是 window,无论有多少层函数调用
function a(){  
    function b(){      
        function c(){
            console.log(this)
        }
        c()
    }
    b()
}
a() //window

所有者对象是函数,但所有者对象外层是对象,this指向仍然是window

var a = 'global';
var obj = {
	a : 'local',
	test : function(){
		function test1(){
			alert(this.a);
		}

		test1();	//global
	}
};
obj.test();
  1. 当函数执行空间是对象时,this指向此对象
window.color = "red";
var o = { color: "blue" };
function sayColor(){
 alert(this.color);
}
sayColor(); //"red"
o.sayColor = sayColor;
o.sayColor(); //"blue" 

[[scoep]]和作用域链

在创建函数时,会创建一个预先包含当前执行环境(即所创建函数的所有者执行环境)所有变量对象的作用域链,这个作用域链被保存在内部的[[Scope]]属性中。

在调用函数时,会为函数创建一个运行上下文对象,运行上下文定义了函数的执行环境,然后通过复制函数的[[Scope]]属性中的对象构建起执行环境的作用域链。此后,将函数的所有局部变量、命名参数、参数集合以及this构建为一个对象,称为活动对象,并被推入执行环境作用域链的前端

如果在此函数中有定义新的函数,那此函数的执行环境的作用域链就会保存到新函数的[[Scope]]属性中,重复以上操作

当函数执行完毕后,运行上下文就被销毁,如无内部函数作用域的引用,活动对象也会一起被销毁

补充资料:

【Javascript】深入理解javascript作用域与作用域链
【Javascript】深入理解this作用域问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值