call()、apply()、arguments

一、call(),apply()

1、作为函数对象(指函数方法名,不带括号)的方法,需要通过函数对象调用;当对函数调用这两个方法时都会调用函数执行。

<script>
    // 这个函数中,foo为函数对象
    function foo() {
        console.log(this + "——" + this.a);
    }
    var a = "Hello World";

    foo(); // [object Window]——Hello World
    foo.call(); // [object Window]——Hello World
    foo.apply(); // [object Window]——Hello World
</script>

 

2、调用call、apply可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行时的this所指。

<script>
    // 这个函数中,foo为函数对象
    function foo() {
        console.log(this + "——" + this.a);
    }
    var a = "Hello World";

    var obj = {
        a: "wonderful"
    }
    foo(); // [object Window]——Hello World
    foo.call(obj); // [object Object]——wonderful
    foo.apply(obj); // [object Object]——wonderful
</script>

// this对象打印后面还有内容时,会简写成[object Window]
<script>
    var animal = {
        type: "cat",
        sayType: function() {
            console.log(this.type);
        }
    };

    var animal2 = {
        type: "dog"
    };

    animal.sayType(); // cat
    animal.sayType.call(animal2); // dog
    animal.sayType.apply(animal2); // dog
</script>
 

这里延伸提下函数的上下文this对象
函数调用时,浏览器为我们传递两个隐含参数:函数上下文对象this、封装实参的对象arguments。
1)在函数中,this指的是全局对象window; foo()函数调用中,this为window。
2)以对象方法调用时,this指的是调用方法的对象; animal.sayType()函数调用中,this为animal。
3)使用call、apply调用时,this指的是call、apply的第一个参数;foo.call(obj)。
4)以构造函数的形式调用时,this指的是新创建的对象, 如下说明。
5)事件中,this指的是接收事件的元素,如下说明。

用于说明4)点
<script>
    function Dog() {
        this.type = "Animal";
        this.sayType = function () {
            console.log(this);
            console.log(this + " belong to " + this.type);
        }
    }
    var obj = new Dog();
    obj.sayType();
    // Dog {type: "Animal", sayType: ƒ}
    // [object Object] belong to Animal
</script>

用于说明5)点
<button id="btn">Click</button>
<script>
    document.getElementById("btn").addEventListener("click", properties);
    function properties() {
        console.log(this);
        console.log(this.id);
    }
    properties();  // 因为默认全局对象为window,这个对象可以忽略不写,相当于window.properties()
    
    // 有些内容可能一开始就接触过了,但始终不能心领神会其中含义,直到有一天你坚持去了解时,醍醐灌顶的感觉
    // 函数代表一种行为,要知道这个行为可以作什么需要有调用这个行为的事物。
    // 比如汽车具有发动行为,启动发动这个行为车子就会动。
    // 编程语言中,函数可以类比发动行为,调用函数的对象抽象类比成汽车对象。
</script>

  

call()和 apply()区别:
call()方法可以将实参之后依次传递;apply()方法需要将实参装到一个数组中统一传递。

 


二、arguments
arguments参数列表,实参列表(函数在调用时,隐含传递封装实参的类数组对象,注意是实参对象)。
arguments作为类数组对象,它可以通过索引来操作,可获取长度,在调用参数时,传递的实参都会保存在arguments中。
即使不定义形参也可以通过arguments来使用实参里某项实参。
arguments中有个属性callee,这个属性对应一个函数对象,就是当前正在执行的函数对象。




posted @ 2021-07-02 15:51  し7709  阅读(61)  评论(0编辑  收藏  举报