关于call 和 apply

权威指南上的说法是:能够将call 和apply看作是某个对象的方法,经过调用方法的形式数组

间接调用函数;须要重点说明是 :经过call和apply 调用的 函数:具体用法---》以下:
app

1.先说call的用法,call能够接收两个参数,也可能不是两个;第一个参数是要调用函数的函数

母对象,在函数体内经过this来得到对它的引用;post

function a(){
console.log(this); // 输出函数a中的this对象
}this

function b(){} // 定义函数b
var obj = {name:'onepixel'}; //定义对象objcode

//调用
a();//this表明window对象;
a.call;//自己是一个函数方法//window
console.log(a.call); //function call() { [native code] };
a.call(null); //window 传入null,函数中的this,指向window
a.call(undefined);//window 传入undefined,函数中的this,指向window
a.call(1); //Number 传入数值型,this指向对应的包装类型,Number
a.call(''); //String 传入字符串,this指向string 类型
a.call(true); //Boolean 传入布尔类型,this指向Boolean类型
a.call(b);//function b(){}
a.call(obj); //Object 指向obj;
//call的用法;对象

能够看到call()中第一个参数出入什么样的参数,this 就指向对应的包装类型;继承

不传参,或者参数为null,undefined 时,this指向window;字符串

具体用法:string

//call的用法;
var m = {
  name:'onepixel',
    say:function(){
    console.log('hi,i am function m!');
    },
  }

  function n(name){
    console.log('post params:'+name);
    console.log('i am '+this.name);
    this.say;
  }
n.call(m,'test');//post params:test
// i am onepixel
//I'm function a! 不知道为何没有调用;

也就是说n能够经过call来调用M 中的方法; 
//关于appply
//apply和call的惟一区别是第二个参数的传递方式不一样,
//apply的第二个参数必须是一个数组,而call容许传递一个参数列表
//值得你注意的是,虽然apply接收的是一个参数数组,但在传递给调用函数时,
//倒是以参数列表的形式传递

function f(x,y,z){
console.log(x,y,z)
}
f.apply(undefined,[1,2,3]);//1,2,3

//第一个参数传null或undedined指向window
重点://js中么有继承的概念,call和apply却能够实现;

function Animal(name,weight){
    this.name = name;
    this.weight = weight;
  }
function Cat(){
    Animal.call(this,'cat','50');
    //Animal.apply(this,['cat','50']);
    this.say = function(){
    console.log('i am '+this.name+'myweight'+this.weight)
    }

  }

var cat = new Cat();
cat.say();

这段代码本身理解一下。。。。

相关文章
相关标签/搜索