zoukankan      html  css  js  c++  java
  • js中this的四种调用模式

    在javascript中一共有四种调用模式:方法调用模式,函数调用模式,构造器调用模式,apply调用模式

    这些模式在如何初始化关键参数this上存在差异。

    1 方法调用模式(也就是用"."的方式来调用的)

    当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。如果一个调用表达式包含一个属性存取表达式(即一个.点表达式或者[subscript]下标表达式),那么它被当做一个方法来调用

    var myObject = {

      value :0;

      increment:fucntion (inc){

        this.value += typeof inc ==='number' ? inc:1;

      }

    };

    myObject.increment();

    document.writeln(myObject.value);  //1

    myObject.increment(2);

    document.writeln(myObject.value);  //3

    方法可以使用this去访问对象,所以它能从对象中取得或修改该对象。this到对象的绑定发生在调用的时候。这个“超级”迟绑定( very late binding)使得函数可以对this高度复用。通过this可取得它们所属对象的上下文的方法称为公共方法。

    2 函数调用模式

    当一个函数并非一个对象的属性是,那么它被当做一个函数来调用:
    var sum = add(3,4); //sum的值为7
    当函数以此模式调用时,this被绑定到全局对象。这是语言设计上的一个错误,倘若语言设计正确,当内部函数被调用时,this应该仍然绑定到外部函数的this变量。这个设计错误错误的后果是方法不能利用内部函数来帮助它工作,因为内部函数的this被绑定了错误的值,所以不能共享该方法对对象的访问权。幸运的是,有一个很容易的解决方案:如果该方法定义一个变量并给他赋值为this,那么内部函数就可以通过那个变量访问到this。
    //给myObject增加一个double方法
    myObject.double = function(){
        var that = this; //解决方案
        var helper = function(){
            that.value = add(that.value,that.value);
        };
        helper();//以函数的形式调用helper
    };
    //以方法的形式调用double
    myObject.double();
    document.writeln(myObject.getValue()); //6

  • 相关阅读:
    HDU 2899 Strange fuction
    HDU 2899 Strange fuction
    HDU 2199 Can you solve this equation?
    HDU 2199 Can you solve this equation?
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 699 掉落的方块(线段树?)
    Java实现 LeetCode 699 掉落的方块(线段树?)
    Java实现 LeetCode 699 掉落的方块(线段树?)
  • 原文地址:https://www.cnblogs.com/RightDear/p/3230618.html
Copyright © 2011-2022 走看看