javascript中this的简单认识

javascript中this的简单认识

this关键字是JavaScript中最复杂的机制之一,但是this的使用可以根据不同的上下文对象去复用函数,不用为每一个对象编写不同版本的函数。

对this的误解

在了解this机制之前,先要消除一些对this的误解

  1. 指向自身
    人们很容易根据this的英语理解,将this推断为指向函数自身,但其实并不是,在学习this之前最好把this理解为一个关键字,不要赋予其现实生活中的潜在意义;

  2. this作用域
    this在任何情况下都不指向函数的词法作用域

this到底是什么

this是在运行时进行绑定的,而不是编写时绑定,他的指向完全取决于函数在哪里被调用,他的上下文取决于函数调用时的各种条件。this 的绑定和函数声明的位置没有任何关系,只取决于函数的调用方法。

当一个函数被调用时,会创建一个活动记录(有时候也称为执行上下文),会记录函数在哪里被调用(调用栈)、函数的调用方式、传入参数等信息。this就是这个记录等一个属性、会在函数执行过程中用到

调用位置

调用位置就是函数在代码中被调用的位置,而不是声明的位置。this到底引用的是什么,只用仔细分析调用位置才能回答这个问题。

寻找调用位置首先要分析 执行栈 (就是为了到达当前执行位置所调用的所有函数)。我们关心的调用位置就是在当前正在执行函数的前一个调用中。

function baz(){
	//当前执行栈是:baz
	//因此,当前的调用位置是全局作用域
	console.log("baz");
	bar();//bar 的调用位置
}

function bar(){
	//当前的执行栈是:baz-->bar
	//因此,当前的调用位置在baz中
	console.log("bar");
	foo();//foo的调用位置
}

function foo(){
	//当前的执行栈:baz-->bar-->foo
	//因此,当前的调用位置在bar中
	console.log("foo");
}

baz()//baz的调用位置

从调用栈中分析出出栈中的调用位置,因为这决定了this的绑定

**可以将调用栈理解为函数调用链,在代码中分析执行栈非常麻烦且容易出错,可以在浏览器中打开开发者工具,将要分析执行栈的函数第一行代码设置一个断点或插入一条debugger,运行代码时,执行器会在这个位置暂停,同时会展示当前函数的调用列表。当分析this的绑定时,使用开发者模式得到调用栈,找到栈中第二个函数,这就是真正的调用位置。

绑定规则

找到调用位置,然后判断应用下面那一条规则,从而判断this的绑定


后续更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值