时间:2021-05-26
前言
this 关键字在 Javascript 中非常常见,但是很多开发者很难说清它到底指向什么。大部分人会从字面意思上去理解 this,认为 this 指向函数自身,实际上this 是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调
用时的各种条件。this 的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。
总结: 函数被调用时发生 this 绑定,this 指向什么完全取决于函数在哪里被调用。
一、this 的绑定规则
this 一共有 4 中绑定规则,接下来一一介绍每种规则的解释和规则直接的优先级
1.1 默认绑定(严格/非严格模式)
独立函数调用
严格模式下:
注意下边两种情况
函数 sayName 虽然是在 obj.fn 内部定义的,但是它仍然是一个独立函数调用,this 仍然指向 window。
虽然 bar 是 obj.foo 的一个引用,但是实际上,它引用的是函数本身,因此此时的
bar() 其实是一个不带任何修饰的独立函数调用,因此应用了默认绑定。
1.2 隐式绑定
当函数引用有上下文对象时(例如:obj.foo 这个时候使用 obj 上下文来引用函数 foo),隐式绑定规则会把函数中的 this 绑定到这个上下文对象。
对象属性引用链中只有上一层或者说最后一层在调用中起作用。
隐式丢失
被隐式绑定的函数会丢失绑定对象,而应用默认绑定,把 this 绑定到全局对象或者 undefined(严格模式) 上。
第一种
虽然 bar 是 obj.foo 的一个引用,但是实际上,它引用的是函数本身,因此此时的bar() 其实是一个不带任何修饰的独立函数调用,因此应用了默认绑定。
第二种传入回调函数时:
1.3 显示绑定
通过 call() 或者 apply()方法。第一个参数是一个对象,在调用函数时将这个对象绑定到 this 上,称之为显示绑定。
显示绑定引申出来一个硬绑定,代码如下
bar函数无论如何调用,它总会手动在 obj 上调用 fn,强制把 fn 的 this 绑定到了 obj。这样也解决前面提到的丢失绑定问题
由于硬绑定是一种非常常用的模式,所以在 ES5 中提供了内置的方法 Function.prototype.bind
1.4 new绑定
使用new来调用函数,或者说发生构造函数调用时,会自动执行下面的操作。
例如:
如下图是 new foo() 这个对象
二、四种绑定关系的优先级
判断this,可以按照下面的顺序来进行判断:
1、函数是否在 new 中调用(new 绑定)?如果是的话 this 绑定的是新创建的对象。
var bar = new foo()2、函数是否通过 call、apply(显式绑定)或者硬绑定调用?如果是的话,this 绑定的是指定的对象。
var bar = foo.call(obj2)3、函数是否在某个上下文对象中调用(隐式绑定)?如果是的话,this 绑定的是那个上下文对象。
var bar = obj1.foo()4、如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到 undefined,否则绑定到全局对象。
var bar = foo()总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了JavaScript数组及常见操作方法。分享给大家供大家参考,具体如下:数组及操作方法数组就是一组数据的集合,javascript中,数组里面的数
用JavaScript解析XML数据是常见的编程任务,JavaScript能做的,JQuery当然也能做。下面我们来总结几个使用JQuery解析XML的例子。第
本文实例讲述了JavaScript解析及序列化JSON的方法。分享给大家供大家参考,具体如下:JSON之所以这么流行,是因为JSON数据结构可以被解析为Java
本文实例讲述了JS使用parseInt解析数字实现求和的方法。分享给大家供大家参考。具体如下:在网页上使用JavaScript函数中的parseInt解析数字,
本文实例讲述了javascript解析ajax返回的xml和json格式数据。分享给大家供大家参考,具体如下:写个例子,以备后用一、JavaScript解析返回