zoukankan      html  css  js  c++  java
  • javascript中的this总结

    1、关于this
    我们需要根据 "调用位置" 上函数的 "调用方式" 来确定函数中this使用的 "绑定规则"

    2、绑定规则

    • 非严格模式下:

        (1)默认绑定: this==>winow对象
        (2)隐式绑定
          1.this==>函数引用的上下文对象
          2.隐式丢失:发生引用传递时会有隐式丢失的情况:引用赋值 & 函数参数传递(也可以理解为回调函数)==》this为默认全局对象或者undefined(严格模式)
          3.隐式丢失解决方案:使用硬绑定(一种显式绑定的形式)
        (3)显式绑定
          this==>我们指定的对象,call/apply/bind
        (4)new绑定
          this==>实例对象

    • 严格模式下:

        (1)默认调用:this => undefined

        (2)隐式绑定:同默认调用

    3、优先级
        new绑定 > 显示绑定 > 隐式绑定 > 默认绑定

    4、正常情况下的规则
    (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()

    5、绑定例外
    (1)在某些场景下this的绑定行为会出乎意料,你认为应当应用其他绑定规则时,实际上应用的可能 是默认绑定规则:把 null 或 undefined 作为 this 的绑定对象传入 call / apply / bind 时应用默认绑定;

       更安全的 this 绑定:DMZ(空的非委托的对象):Object.create(null),没有 prototype 

    var ~ = Object.create(null); 
    foo.apply(~, [2,3]); 
    
    var bar = foo.bind(!, 2); 
    bar(3);

    (2)软绑定:箭头函数的this不符合我们的this正常的绑定规则,箭头函数的 this 根据外层函数(函数或全局)决定,且绑定后无法修改;

    6、柯里化
      只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。(预定义一些参数)
      柯里化:也常译为“局部套用”,是把多参数函数转换为一系列单参数函数并进行调用的技术

  • 相关阅读:
    Eclipse的自动排版设置(format)
    Java中" "表示几个空格
    cookie和session详解
    IO流操作详解
    springmvc常用注解标签详解
    mavenWeb工程建立步骤
    数据导出为excel表格
    Springmvc jar包介绍
    【初级算法】5.只出现一次的数字
    【初级算法】4.存在重复
  • 原文地址:https://www.cnblogs.com/momo798/p/6270509.html
Copyright © 2011-2022 走看看