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

  • 相关阅读:
    三次请求(读-改-读)引出nibernate 一级缓存
    算法竞赛入门经典第一、二章摘记
    uva 10905 Children's Game
    uva 11205 The broken pedometer
    uva 10160 Servicing stations
    uva 208 Firetruck
    uva 167 The Sultan's Successors
    zoj 1016 Parencodings
    uva 307 Sticks
    uva 216 Getting in Line
  • 原文地址:https://www.cnblogs.com/momo798/p/6270509.html
Copyright © 2011-2022 走看看