javascript中的call, apply(转载)

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

定义:html

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

做用:java

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

用法:jquery

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

 

差异:app

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的背景都变为红色的了.
    });
相关文章
相关标签/搜索