zoukankan      html  css  js  c++  java
  • javascript中的call, apply(转载)

    转载自 https://www.cnblogs.com/tinkbell/p/3200488.html

    定义:

    call, apply是函数的方法, 只有函数才有这2个方法.

    作用:

    call, apply主要作用是改变函数赖以执行的作用域, 简言之就是改变函数中this的指向.

    用法:

    fn.call(obj, args1, args2, ...); //obj是指定函数赖以执行的对象, arg1等是传给函数的参数(假如有的话) 
    fn.apply(obj, [args1, args2, ...]); //obj是指定函数赖以执行的对象, [arg1, ...]等是传给函数的参数数组(假如有的话)

    差别:

    call和apply的差别就是参数的不同.
    call中的参数必须是一个个枚举出来的.
    apply中的参数必须是数组或者是arguments对象

    // 例子1:
       function fn(arg){
          alert(arg);
       }
        fn.call(this, 'hello world'); //hello world, 由于fn中没指定this, 所以此时的this指向window对象.
        fn.apply(this, ['hello world']); //hello world, 由于fn中没指定this, 所以此时的this指向window对象.
    
    
       
      // 例子2:
       function fn(arg1, arg2, arg3){
          alert(arg1 + arg2 + arg3);
       }
        fn.call(this, 'hello world', 'petty', 'jack'); //hello worldpettyjack
        fn.apply(this, ['hello world', 'petty', 'jack']); //hello worldpettyjack
        
    
    
      // 例子3:
       function myFn(arg1, arg2, arg3){
          alert(arg1 + arg2 + arg3);
       }
       function fn(arg1, arg2, arg3){
          myFn.apply(this, arguments); //此处传arguments对象, 即fn中的[arg1, arg2, arg3]
       }
       fn('hello', 'world', '!'); //helloworld!
       
       
    
      // 例子4:
       var o = {
          name: 'tom'
       };
       function fn(){
          alert(this.name);
       }
       fn.call(this); //此时this指向window, 所以是window的name值
       fn.call(o); //此时this指向o, 所以是o的name值, 'tom'
       fn.apply(o); //同上
       
    
    
      // 例子5:
       function MyFn(name){
           this.name = name;
       } // 定义一个构造函数
       
       function Fn(age, name){
           this.age = age;
           MyFn.call(this, name); // 理解了call的定义后, 就不难看出, 此处继承了MyFn的name属性.
           //MyFn.apply(this, [name]); // 也可
       } // 定义另一个构造函数
       
       var person = new Fn(20, 'tom');
       alert(person.name); // 原本Fn是没有name属性的, 但是使用了call或者apply后, 就继承了MyFn的name属性, 所以为'tom'
    
    
       
      // 理解了以上的call和apply的原理后, 我们一起来模仿jquery中each函数.
        
        function each(obj, fn){
            var i;
            if(Object.prototype.toString.call(obj) === '[object Array]'){
                for(i = 0, length = obj.length; i < length; i++){
                    fn.call(obj[i], i, obj[i]);
                }
            }
            else if(typeof obj === 'object'){
                for(i in obj){
                    if(obj.hasOwnProperty(i)){
                       fn.call(obj[i], i, obj[i]);
                    }
                }
            }
            else{
                return false;
            }
        }
        
        var oDiv = document.getElementsByTagName('div');
        each(oDiv, function(){
            this.style.background = '#ff0000'; // 所有div的背景都变为红色的了.
        });
    

      

  • 相关阅读:
    改进的二分查找
    关于Java并发编程的总结和思考
    java异常捕获案例,此题的出处是《Java编程思想》一书
    一道关于int和Integer的面试题
    看《韩顺平Java》视频的笔记
    spring task 定时任务执行两次
    记录
    Java基础面试题
    TeamViewer修改绑定设备
    jqGrid常用操作
  • 原文地址:https://www.cnblogs.com/fengnovo/p/9908229.html
Copyright © 2011-2022 走看看