zoukankan      html  css  js  c++  java
  • 理解call及apply

    转载自:http://www.zhihu.com/question/20289071
    
    //call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。
    var func1 = function(arg1, arg2) {};
    
    /*通过 func1.call(this, arg1, arg2); 或者 func1.apply(this, [arg1, arg2]); 来调用。其中 this 是你想指定的上下文,
    他可以是任何一个 JavaScript 对象,call 需要把参数按顺序传递进去,而 apply 则是把参数放在数组里。
    当你的参数是明确知道数量时,用 call,而不确定的时候,用 apply,然后把参数 push 进数组传递进去。*/
    
    function cat() {
    }
    
    cat.prototype = {
        food: "fish",
        say: function () {
        alert("I love " + this.food);
    }}
    
    var blackCat = new cat;
    blackCat.say();
    
    var whiteDog = {food:"bone"}
    blackCat.say.call(whiteDog)
    /*
    如果我们有一个对象whiteDog = {food:"bone"},我们不想对它重新定义say方法,
    那么我们可以通过call或apply用blackCat的say方法:blackCat.say.call(whiteDog);*/
    
    
    function exam(a, b, c, d, e) {
    
        // 先看看函数的自带属性 arguments 什么是样子的
        console.log(arguments);
    
        // 使用call/apply将arguments转换为数组, 返回结果为数组,arguments自身不会改变
        var arg = [].slice.call(arguments);
    
        console.log(arg);
    }
    
    exam(2, 8, 9, 10, 3);
    
    // result:
    // { '0': 2, '1': 8, '2': 9, '3': 10, '4': 3 }
    // [ 2, 8, 9, 10, 3 ]
    //
    // 也常常使用该方法将DOM中的nodelist转换为数组
    // [].slice.call( document.getElementsByTagName('li') );
    

      

  • 相关阅读:
    51nod 1428 活动安排问题
    COGS 1. 加法问题 (水体日常)
    COGS 1406. 邻居年龄排序[Age Sort,UVa 11462](水题日常)
    51nod 1133 不重叠的线段
    51nod 1031 骨牌覆盖
    51nod 1050 循环数组最大子段和
    51nod 1094 和为k的连续区间
    51nod 1433 0和5
    51nod 1092 回文字符串
    洛谷 P1507 NASA的食物计划
  • 原文地址:https://www.cnblogs.com/leyi/p/4777284.html
Copyright © 2011-2022 走看看