JavaScript中的call、apply

JavaScript中的call、apply

call

JavaScript中的call是调用一个函数,在调用函数时,将this的值绑定为call参数中的第一个参数。

var bye = function(param, param2){
    console.log(this);
    console.log(param);
    console.log(param2);
    console.log("bye");
    console.log(this.x)
}

t = {‘x‘: 1};

bye.call(t, 1, 2);

其结果为:

Object {x: 1}

1

2

bye

1

当然,我们也可以将this值绑定为一个原始值,调用上述函数:

bye.call(5, 1, 2);

其结果为:

Number {[[PrimitiveValue]]: 5}

1

2

bye

在non-strict 模式下,如果我们将null,undefined和原始类型的值传给this参数,其this值将被global代替,在MDN中有这样的说明:

thisArg

The value of this provided for the call to fun. Note that this may not be the actual value seen by the method: if the method is a function in non-strict mode code, null and undefined will be replaced with the global object, and primitive values will be boxed.

call函数的作用就是我们在调用方法时可以设定一个不同的对象,因为其默认的对象就是当前对象,正因为这样,我们可以只写一次该方法,在另一对象中继承该方法,然后调用它,而不需要再写一遍该方法。MDN中对该方法的介绍:

You can assign a different this object when calling an existing function. this refers to the current object, the calling object. With call, you can write a method once and then inherit it in another object, without having to rewrite the method for the new object.

应用场景一:利用call实现继承(Using call to chain constructors for an object)

function Product(name, price) {
  this.name = name;
  this.price = price;

  if (price < 0) {
    throw RangeError(‘Cannot create product ‘ +
                      this.name + ‘ with a negative price‘);
  }

  return this;
}

function Food(name, price) {
  Product.call(this, name, price);
  this.category = ‘food‘;
}

Food.prototype = Object.create(Product.prototype);

function Toy(name, price) {
  Product.call(this, name, price);
  this.category = ‘toy‘;
}

Toy.prototype = Object.create(Product.prototype);

var cheese = new Food(‘feta‘, 5);
var fun = new Toy(‘robot‘, 40);

Food和Toy利用call继承了Product的name和price,然后各自又有了category 属性。

应用场景二:利用call调用匿名函数(Using call to invoke an anonymous function)

var animals = [
  { species: ‘Lion‘, name: ‘King‘ },
  { species: ‘Whale‘, name: ‘Fail‘ }
];

for (var i = 0; i < animals.length; i++) {
  (function(i) {
    this.print = function() {
      console.log(‘#‘ + i + ‘ ‘ + this.species
                  + ‘: ‘ + this.name);
    }
    this.print();
  }).call(animals[i], i);
}

apply

apply与call几乎完全相同,只是在传递参数时apply传递的是数组(array)或者是类似数组的对象( array-like object),其调用方式:

fun.apply(this, [‘eat‘, ‘bananas‘]);
fun.apply(this, new Array(‘eat‘, ‘bananas‘));
时间: 2024-08-07 14:19:31

JavaScript中的call、apply的相关文章

javascript中call和apply方法

转:http://www.cnblogs.com/ArthurPatten/p/3335912.html 我们可以将call和apply看做是某个对象的方法,通过调用方法的形式来间接调用函数.call和apply的第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对它的引用. 例如,如果要想以对象o的方法来调用函数f,可以按如下的方式使用call和apply方法: f.call(o); f.apply(o); 可以按如下的代码来理解: o.m = f; //将f存储为o

面试官:能解释一下javascript中bind、apply和call这三个函数的用法吗

一.前言    不知道大家还记不记得前几篇的文章:<面试官:能解释一下javascript中的this吗> 那今天这篇文章虽然是介绍javascript中bind.apply和call函数,但是多少也和this有点关联. 假如在前面那场面试末尾,面试官不依不饶继续问你javascript中的this,那看完本篇文章后一定还会有收获. (本篇文章不会站在this的角度去回答问题,而是重于解释bind.apply和call这三个函数的用法和使用场景) 二.正戏开始 面试官:能解释一下javascr

Javascript中call,apply,bind方法的详解与总结

在 javascript之 this 关键字详解 文章中,谈及了如下内容,做一个简单的回顾: 1.this对象的涵义就是指向当前对象中的属性和方法. 2.this指向的可变性.当在全局作用域时,this指向全局:当在某个对象中使用this时,this指向该对象:当把某个对象的方法赋值给另外一个对象时,this会指向后一个对象. 3.this的使用场合有:在全局环境中使用:在构造函数中使用,在对象的方法中使用. 4.this的使用注意点,最重要的一点就是要避免多层嵌套使用this对象. 对this

javascript中 Function.prototype.apply()与Function.prototype.call() 对比详解

Function.prototype.apply()|Function.prototype.call() apply()方法可以在使用一个指定的 this 值和一个参数数组(或类数组对象)的前提下调用某个函数或方法.call()方法类似于apply(),不同之处仅仅是call()接受的参数是参数列表. 简而言之: apply()一个this,一个参数 call()   一个this,多个参数 语法 fun.apply(thisArg[, argsArray])|fun.call(thisArg[

JavaScript中Math.max.apply()和Math.max()的区别

JavaScript中Math.max()方法可以求出给定参数中的最大值,给定参数≥2个,可以使多个,但是必须是数字. > Math.max(1,2,3,5,9,4); < 9 > Math.min(1,0,-1); < -1 但是如果直接求数组中所有数字的最大值,就不能直接这么使用了,此时就需要使用到apply方法: apply方法(Function)(JavaScript) 调用函数,并用制定对象替换函数的this值,同时用指定数组替换函数的参数. apply([thisObj

Javascript中call和apply的区别与详解

在js中call和apply它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数方式有所区别,下面我来给大家介绍一下call和apply用法: 在web前端开发过程中,我们经常需要改变this指向,通常我们想到的就是用call方法: 说明:a.call(b,arg1,arg2..)就是a对象的方法应用到b对象上 a.apply(b,[arg1,arg2,....])也是a对象的方法应用到b对象上,只不过是第二个参数不一样而已: 例如: function add(a,b){alert(

JavaScript中Call()以及Apply()的应用

apply()和call()的真正用武之地是能够扩充函数赖以运行的作用域 三点说明: 1.每个函数都包含两个非继承而来的方法:apply()和call(). 2.他们的用途相同,都是在特定的作用域中调用函数. 3.接收参数方面不同,apply()接收两个参数,一个是函数运行的作用域(this),另一个是参数数组.  call()方法第一个参数与apply()方法相同,但传递给函数的参数必须列举出来. 使用实例: 第一个实例: function print(a, b, c, d) { alert(

Javascript中call()和apply()的用法 ----2

前言 call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向.call 和 apply二者的作用完全一样,只是接受参数的方式不太一样. 方法定义applyFunction.apply(obj,args)方法能接收两个参数: obj:这个对象将代替Function类里this对象 args:这个是数组或类数组,apply方法把这个集合中的元素作为参数传递给被调用的函数. call call方法与apply方法的第

javascript中call、apply、bind详解

1.apply和call的区别在哪里 2.什么情况下用apply,什么情况下用call 3.apply的其他巧妙用法(一般在什么情况下可以使用apply) 我首先从网上查到关于apply和call的定义,然后用示例来解释这两个方法的意思和如何去用. apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性. Function.apply(obj,args)方法能接收两个参数 obj:这个对象将代替Function类里this对象 args:这个是数组,它将作为参数传给Function(a

深入浅出:了解JavaScript中的call,apply,bind的差别

在 javascript之 this 关键字详解文章中,谈及了如下内容,做一个简单的回顾: 1.this对象的涵义就是指向当前对象中的属性和方法. 2.this指向的可变性.当在全局作用域时,this指向全局:当在某个对象中使用this时,this指向该对象:当把某个对象的方法赋值给      另外一个对象时,this会指向后一个对象. 3.this的使用场合有:在全局环境中使用:在构造函数中使用,在对象的方法中使用. 4.this的使用注意点,最重要的一点就是要避免多层嵌套使用this对象.