this

来源:互联网 发布:在线算法的特点 编辑:程序博客网 时间:2024/06/01 08:13

this(函数的 上下文对象)

函数在执行时,浏览器每次都会传递进两个隐含的参数this 和 arguments,这个参数是 函数的 上下文对象,我们可以通过this来使用该对象。this 本身不具有含义
- 根据函数调用方式的不同,this的值也不同
1.以函数的形式调用时,this永远都是window
2.以方法的形式调用时,this是调用方法的对象

  • this 的指代的不同含义:
    1,this 在事件处理的函数中 ,指代 获取触发当前事件的元素
    2,this 在普通函数中 , 指代 window 对象
    3,this 在全局域中, 指代 window 对象
    4,this 在构造函数中, 指代 创建的对象
    5,this 在对象中, 指代 当前的对象
    6, 以call()和apply()调用时,this是方法中的第一个参数

this指代的含义(绑定规则另一种理解):

  1. 独立函数调用。可以把这条规则看作是无法应用其他规则时的默认规则

    • 独立函数调用,如果使用了非严格模式,this 会绑定到全局对象(window)
    • 独立函数调用,如果使用严格模式( strict mode ),this 会绑定到 undefine

      无论函数是在哪个作用域中被调用,只要是独立调用则就会按默认绑定规则被绑定到全局对象或者undefined上
  2. 隐式绑定的规则是调用位置是否有上下文对象,或者说是否被某个对象拥有或者包含。当函数引用有上下文对象时,隐式绑定规则会把函数调用中的 this 绑定到这个上下文对象
    • 对象属性引用链中只有最顶层或者说最后一层会影响调用位置

      //就是最顶层或是最后一层会影响调用位置,这里指的是obj2
      obj1.obj2.fun();

绑定规则

  • 默认绑定
    this==>winow对象
  • 隐式绑定
    1. this==>函数引用的上下文对象
    2. 隐式丢失:发生引用传递时会有隐式丢失的情况(引用赋值,参数传递会发生隐式丢失)
    • 隐式丢失解决方案
      使用硬绑定(一种显示绑定的形式)
  • 显示绑定
    this==>我们指定的对象
  • new绑定
    this==>实例对象

优先级

new绑定 > 显示绑定 > 隐式绑定 > 默认绑定  

正常情况下的规则

  1. 函数是否在new中调用(new绑定)?如果是的话this绑定的是新创建的对象。
    var bar = new fun()
  2. 函数是否通过call、apply(显式绑定)或者硬绑定调用?如果是的话,this绑定的是指定的对象。
    var bar = fun.call(obj2)
  3. 函数是否在某个上下文对象中调用(隐式绑定)?如果是的话,this绑定的是那个上下文对象。
    var bar = obj1.fun()
  4. 如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到undefined,否则绑定到全局对象。
    var bar = fun()

绑定例外

在某些场景下this的绑定行为会出乎意料,你认为应当应用其他绑定规则时,实际上应用的可能 是默认绑定规则

柯里化

只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。(预定义一些参数)

例外

如果你把 null 或者 undefined 作为 this 的绑定对象传入 call 、 apply 或者 bind ,这些值在调用时会被忽略,实际应用的是默认绑定规则

function foo() {    console.log( this.a );  // 2        }        var a = 2;        foo.call( null ); 

使用工厂方法来创建对象

function createPerson(形参){                var obj = new Object();     //创建一个新的对象                obj.name = name;           //向对象中添加属性                return obj;           //将对象作为返回值返回          }
  • arguments 只出现在函数体内,在函数外面是找不到
  • arguments是一个类数组对象,在这个对象中封装了函数调用时的实参
  • 所有的实参都在arguments中保存,即使不定义形参也可以通过arguments来获取实参,无论形参有没有,他只获取得实参,他获取所有的实参。
    它调用的方法是:arguments[数值]
    • 属性:length 表示arguments中实参的长度
      在JavaScript中没有函数多载,常利用这种方法实现函数重载的效果:定义多个相同名字的函数,根据需求运行对应的函数。
    • undefined 加其他任何类型的值,结果都是undefined
原创粉丝点击