博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解this机制系列第二篇——this绑定优先级
阅读量:7120 次
发布时间:2019-06-28

本文共 1235 字,大约阅读时间需要 4 分钟。

前面的话

  上一篇介绍过this的,那如果在函数的调用位置上同时存在两种以上的绑定规则应该怎么办呢?本文将介绍this绑定的优先级

 

显式绑定 pk 隐式绑定

  显式绑定胜出

function foo() {    console.log( this.a );}var obj1 = {    a: 2,    foo: foo};var obj2 = {    a: 3,    foo: foo};obj1.foo(); // 2obj2.foo(); // 3 //在该语句中,显式绑定call(obj2)和隐式绑定obj1.foo同时出现,最终结果为3,说明被绑定到了obj2中obj1.foo.call( obj2 ); // 3obj2.foo.call( obj1 ); // 2

 

new绑定 pk 隐式绑定

  new绑定胜出

function foo(something) {    this.a = something;}var obj1 = {foo: foo};var obj2 = {};obj1.foo( 2 );console.log( obj1.a ); // 2obj1.foo.call(obj2,3);console.log( obj2.a ); // 3//在下列代码中,隐式绑定obj1.foo和new绑定同时出现。最终obj1.a结果是2,而bar.a结果是4,说明this被绑定在bar上var bar = new obj1.foo( 4 );console.log( obj1.a ); // 2console.log( bar.a ); // 4

 

new绑定 pk 显式绑定

  new绑定胜出

function foo(something) {    this.a = something;}var obj1 = {};//先将obj1绑定到foo函数中,此时this值为obj1var bar = foo.bind( obj1 );bar( 2 );console.log(obj1.a); // 2//通过new绑定,此时this值为bazvar baz = new bar( 3 );console.log( obj1.a ); // 2//说明使用new绑定时,在bar函数内,无论this指向obj1有没有生效,最终this都指向新创建的对象bazconsole.log( baz.a ); // 3

 

顺序

  【1】是否是new绑定?如果是,this绑定的是新创建的对象

var bar = new foo();

  【2】是否是显式绑定?如果是,this绑定的是指定的对象

var bar = foo.call(obj2);

  【3】是否是隐式绑定?如果是,this绑定的是属于的对象

var bar = obj1.foo();

  【4】如果都不是,则使用默认绑定

var bar = foo();

 

转载地址:http://jxiel.baihongyu.com/

你可能感兴趣的文章
[LeetCode] 4 Keys Keyboard 四键的键盘
查看>>
【树莓派】服务配置相关3:基于Ubuntu Server的服务配置
查看>>
Linux常用的基础组件
查看>>
线上系统问题定位
查看>>
springboot的application.properties与.yml的区别
查看>>
P1330 封锁阳光大学
查看>>
xtrabackup-增量备份
查看>>
[Python]Python Class 中的 函数定义中的 self
查看>>
操作系统习题
查看>>
pip安装-mac电脑
查看>>
Java IO编程全解(六)——4种I/O的对比与选型
查看>>
HBase流量限制和表负载均衡剖析
查看>>
一个多maven项目聚合的实例
查看>>
windows server 2012 st 版本的php环境问题修复 与删除
查看>>
django -- 联合索引
查看>>
分组聚合
查看>>
struts ValueStack 详解
查看>>
WebApi实现验证授权Token,WebApi生成文档等 - CSDN博客
查看>>
会议室预定设计
查看>>
实战申请Let's Encrypt永久免费SSL证书过程教程及常见问题
查看>>