• 函数调用拾遗


    函数调用总结

    通常构成函数主题的JS代码在定义之时是不会被执行的,只有在调用函数是才会被执行
    有4种方式可以调用JS函数

    函数调用

    //定义函数 factorial
    function factorial(){
        if(x <= 1) return 1;
        return x * factorial(x-1);
    }
    var probability = factorial(5)
    

    以函数形式调用的函数通常不适用this关键字

    方法调用

    方法调用和函数调用区别在于:调用上下文。
    如果有一个 函数 f 和 对象 o
    给o定义一个m()的方法

    o.m = f
    

    给对象o定义方法m(),调用时就像这样

    o.m()
    

    其中o就成为调用上下文,函数体可以使用关键字this引用该对象
    一个具体的例子:

    var calculator = {
        operand1 : 1;
        operand2 : 2;
        add : function(){
            this.result = this.operand1+this.operand2;
        }
    };
    calculator.add();//方法调用1+1的结果
    calculate.result // => 2
    

    this关键字

    关键字this和变量不同,没有作用域的限制,嵌套的函数不会从调用他的函数中继承this
    如果嵌套函数作为方法调用,this值指向调用它的对象。
    如果嵌套函数作为函数调用,this指向全局对象或undefined
    很多人误认为调用嵌套函数时this会指向调用外层函数的上下文。
    如果你想这个外部函数的this值时,需要将this值保存在一个变量里,这个变量和内部函数都在同一作用域内。

    var o = {
        m:function(){ //对象中的m()方法
            var self = this;//保存this值
            console.log(this === o);//true,this就是这个对象o
            f(); //调用辅助函数f()
            
            function f(){
                console.log(this === o);//false,this的值是全局对象或undefined
                console.log(this === o);//true,self指外部函数的this值
            }
        }
    };
    

    构造函数调用

    构造函数调用与函数调用、方法调用在实参处理,调用上下文和返回值方面都有不同。

    构造函数调用在圆括号里包含实参列表,则先计算实参表达式,这与函数调用和方法调用是一致的。
    如果构造函数没有形参,JS构造函数调用语法是可以省略()的

    var o = new Object();
    var o = new Object;//等价
    

    构造函数调用创建一个空对象,继承自构造函数prototype属性,构造函数试图初始这个新创建的对象,作为其调用的上下文,因此,构造函数可以使用this来引用这个新创建的对象。
    构造函数通常不使用return,当执行完函数体后,会显示返回。

    间接调用

    JS函数也是对象,自然也有方法。
    其中call(),apply()可以用来间接调用函数。这两个方法都支持显式调用所需this值

    var args = [girl1, girl2];
    var animal = new Animal();
    Man.prototype.fuck.apply(animal, args);

    我们可以将call(),apply()看作某个对象的方法,通过调用方法的形式来简介调用。
    call和apply的第一个实参是要调用的函数的母对象,他是调用上下文,在函数体内可以通过this来获得引用。

  • 相关阅读:
    &lt;Android&gt;greenrobot-EventBus,guava-Event Bus的异步实现
    MySQL Study之--MySQL用户及权限管理
    关于Apacheserver的訪问控制
    Jquery改动页面标题title其他JS失效
    P3742 umi的函数
    P3717 [AHOI2017初中组]cover
    P2261 [CQOI2007]余数求和
    P1423 小玉在游泳
    P1888 三角函数
    3295 落单的数 九章算法面试题
  • 原文地址:https://www.cnblogs.com/10manongit/p/12957237.html
Copyright © 2020-2023  润新知