mozilla
您的搜索结果

    Function.prototype.call()

    概述

    call() 方法在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法.

    注:该方法的作用和 apply() 方法类似,只有一个区别,就是call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组。

    语法

    fun.call(thisArg[, arg1[, arg2[, ...]]])

    参数

    thisArg
    fun函数运行时指定的this值。需要注意的是,指定的this值并不一定是该函数执行时真正的this值,如果这个函数处于非严格模式下,则指定为nullundefinedthis值会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象。
    arg1, arg2, ...
    指定的参数列表。

    描述

    当调用一个函数时,可以赋值一个不同的 this 对象。this 引用当前对象,即 call 方法的第一个参数。

    通过 call 方法,你可以在一个对象上借用另一个对象上的方法,比如Object.prototype.toString.call([]),就是一个Array对象借用了Object对象上的方法。

    示例

    使用call方法调用父构造函数

    在一个子构造函数中,你可以通过调用父构造函数的 call 方法来实现继承,类似于Java中的写法。下例中,使用 Food 和 Toy 构造函数创建的对象实例都会拥有在 Product 构造函数中添加的 name 属性和 price 属性,但 category 属性是在各自的构造函数中定义的。

    function Product(name, price) {
      this.name = name;
      this.price = price;
    
      if (price < 0)
        throw RangeError('Cannot create product "' + name + '" with a negative price');
      return this;
    }
    
    function Food(name, price) {
      Product.call(this, name, price);
      this.category = 'food';
    }
    Food.prototype = new Product();
    
    function Toy(name, price) {
      Product.call(this, name, price);
      this.category = 'toy';
    }
    Toy.prototype = new Product();
    
    var cheese = new Food('feta', 5);
    var fun = new Toy('robot', 40);
    

    使用call方法调用匿名函数

    在下例中的for循环体内,我们创建了一个匿名函数,然后通过调用该函数的call方法,将每个数组元素作为指定的this值执行了那个匿名函数。这个匿名函数的主要目的是给每个数组元素对象添加一个print方法,这个print方法可以打印出各元素在数组中的正确索引号。当然,这里不是必须得让数组元素作为this值传入那个匿名函数(普通参数就可以),目的是为了演示call的用法。

    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);
    }
    

    规范

    规范版本 规范状态 注解
    ECMAScript 3rd Edition. Implemented in JavaScript 1.3. Standard Initial definition.
    ECMAScript 5.1 (ECMA-262)
    Function.prototype.call
    Standard  
    ECMAScript 6 (ECMA-262)
    Function.prototype.call
    Release Candidate  

    浏览器兼容性

    Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
    Basic support (Yes) (Yes) (Yes) (Yes) (Yes)
    Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
    Basic support (Yes) (Yes) (Yes) (Yes) (Yes) (Yes)

    相关链接

    文档标签和贡献者

    Contributors to this page: teoli, ziyunfei, AlexChao
    最后编辑者: teoli,