首页 > 其他分享 >this的设计及绑定规则

this的设计及绑定规则

时间:2023-04-01 21:55:13浏览次数:30  
标签:调用 bar 对象 绑定 new 规则 设计 foo

每个函数的this是在调用时被绑定的,完全取决于函数的调用位置;

什么是调用位置呢?

顾名思义就是“函数被调用的位置”;要去寻找被调用的位置,那么就要分析调用栈,this的调用位置就在当前正在执行的函数的前一个调用中;

举个例子

function baz() {     // 当前调用栈是全局 -> baz,调用位置是上一个执行栈就是全局作用域     bar() // bar的调用位置 } function bar() {     // 当前调用栈是全局 -> baz -> bar,调用位置是上一个执行栈就是baz     foo() // foo的调用位置 } function foo() {     // 当前调用栈是全局 -> baz -> bar -> foo,调用位置是上一个执行栈就是bar } baz() // baz的调用位置   接下来我们看看再函数的执行过程中调用位置是如何决定this的绑定对象的。 this绑定有四条规则,分别是:   a.默认绑定   b.隐式绑定   c.显式绑定   d.new绑定 四种规则分别从弱到强,new绑定优先级最高,依次类推;   默认绑定 可以把这条规则是无法应用其他规则时的默认规则; function foo() {     // this指向全局     console.log(this.a) } a = 1; foo();  // 输出1 这里由于foo函数时直接引用进行调用的,只能使用默认绑定,无法应用其他规则,所以this指向全局对象,而全局变量a为1,所以输出1; 需要注意的是:再严格模式下,this会绑定到undefined,而不是全局对象;   隐式绑定 调用位置是否有上下文对象是隐式绑定需要考虑的规则,或者说是否被某个对象引用; function foo() {     console.log(this.a) } var obj = {     a: 1,     foo: foo } obj.foo(); // 输出1 可以看到,obj对象的foo属性添加了foo函数的引用,当foo被调用时,指向了obj对象,当函数引用有上下文对象时,隐式绑定规则会把this绑定到这个上下文对象,即obj对象; 注意:对象属性引用链中只有最后一层会影响调用位置,举个例子:

function foo() {     console.log(this.a) } var obj1 = {     a: 1,     obj2: obj2 } var obj2 = {     a: 2,     foo: foo } obj1.obj2.foo(); // 输出2   显式绑定 其实这种方法很常见,就是通过call/apply/bind等强绑定,可以直接指定this的绑定对象。这里就不展开描述了   new绑定 相信大家对new构造函数调用都耳熟能详,使用new调用函数,对自动执行下面的操作:   a.创建一个全新的对象;   b.这个新对象会被执行原型连接;   c.这个新对象会被绑定到函数调用的this;   d.如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象; 看以下代码 function foo() {     this.a = a; } var bar = new foo(2); console.log(bar.a); // 2 使用new来调用foo()时,会构造一个新对象并把它绑定到foo()调用中的this上。   接下来总结一下如何判断this   1、函数是否再new中调用?是的话this绑定的是新创建的对象;   2、函数是否通过call/apply调用?是的话this绑定的是指定的对象;   3、函数是否在某个上下文对象中调用?是的话this绑定的是那个上下文对象;   4、如果都不是以上,使用默认绑定,如果在严格模式下,被绑定到undefined,否则就绑定到全局对象; 以上就是this的绑定原理啦~

标签:调用,bar,对象,绑定,new,规则,设计,foo
From: https://www.cnblogs.com/heyujun-/p/17278621.html

相关文章

  • 设计进度条
    设计进度条这也是我第一次接触到progress这个标签,就是用来设计进度条的,然后进度条还需要我们后期进行设计,才能让原本的蓝灰配变得更加“灵动”一些哈!最简单的进度条,源码是这样的:<progressid="pro"value="30"></progress>最简单的呈现效果,没有加一点儿修饰的样子是这样的:......
  • 谈谈Spring中都用到了哪些设计模式?
    ​ 控制反转(IOC)和依赖注入(DI)IoC(InversionofControl,控制翻转) 是Spring中一个非常非常重要的概念,它不是什么技术,而是一种解耦的设计思想。它的主要目的是借助于“第三方”(即Spring中的IOC容器)实现具有依赖关系的对象之间的解耦(IOC容易管理对象,你只管使用即可),从而......
  • 谈谈Spring中都用到了哪些设计模式?
    ​ 控制反转(IOC)和依赖注入(DI)IoC(InversionofControl,控制翻转) 是Spring中一个非常非常重要的概念,它不是什么技术,而是一种解耦的设计思想。它的主要目的是借助于“第三方”(即Spring中的IOC容器)实现具有依赖关系的对象之间的解耦(IOC容易管理对象,你只管使用即可),从而......
  • 平台化设计产品存在的问题
    关于产品的一些思考产品:在将业务抽象成产品或组件时,需要考虑多个因素,包括闭环条款、持久性、可重用性等。只有当业务具备这些关键特征时,才能适合抽象成产品。否则,应该考虑将其作为组件的形式存在,或者使用规则引擎来可视化出来,使用条件积木和行为积木来表达其控制逻辑和操作步骤。......
  • 响应式网页设计
    学习响应式网页设计需要以下几个步骤:学习基本的HTML和CSS知识,了解网页布局和样式设置。熟悉CSS媒体查询语法和使用方法,媒体查询是响应式网页设计的核心,通过媒体查询可以根据屏幕尺寸、分辨率等不同因素来设置不同的CSS样式,从而实现响应式效果。学习响应式网格系......
  • 1.基于规则的优化器
    1.创建测试环境--建表createtableemp_tempasselect*fromemp;createindexidx_mgr_temponemp_temp(mgr);createindexidx_deptno_temponemp_temp(deptno);--查询数据库select*fromemp_tempwheremgr>100anddeptno>10;EMPNOENAMEJOB ......
  • makefile 编写规则
    (一)makefile规则 一般开头都是Tab,不能空格,include前面不能是Tab;1、如果没编译过,将所有的 (.c)文件编译并且链接;2、如果有其中的(.c)文件改变,编译并链接改变的文件;3、如果(.h)文件被修改,编译引用相应的(.c)文件,链接;4、在随意修改时间的情况下,会导致编......
  • DSL5.变量定义区的权限规则
    当事人如果当事人被初始化,将定义一个初始化函数实现当事人的赋值,合约部署者可以对当事人参数进行修改如果当事人被is定义,该当事人将无法修改资产如果资产被当事人拥有,该资产如果被初始化,仅当事人可以修改该资产如果资产未被当事人拥有,该资产处于未定义状态,合约部署者......
  • DSL5.变量定义区的权限规则
    当事人如果当事人被初始化,将定义一个初始化函数实现当事人的赋值,合约部署者可以对当事人参数进行修改如果当事人被is定义,该当事人将无法修改资产如果资产被当事人拥有,该资产如果被初始化,仅当事人可以修改该资产如果资产未被当事人拥有,该资产处于未定义状态,合约部署者......
  • 8086汇编计算次方,模块化设计
    就是把dw那一行的每个字的数据,求三次方,然后存到dd那一行assumecs:code,ds:datadatasegment dw1,2,3,4,5,6,7,8 dd0,0,0,0,0,0,0,0;;双字,32位dataendscodesegmentmain: movax,data movds,ax callcul;;放到子程序里计算 movax,4c00h int21hcul:......