简单的说就是改变函数执行的上下文,这是最基本的用法。两个方法基本区别在于传参不同。 call(obj,arg1,arg2,arg3);call第一个参数传对象,可以是null。参数以逗号分开进行传值,参数可以是任何类型。 apply(obj,[arg1,arg2,arg3]);apply第一个参数传对象,参数可以是数组或者arguments 对象。 这两个方法通常被用来类的继承和回调函数: 作用一、类的继承: 先来看这个例子: 代码如下: function Person(name,age){ this.name = name; this.age=age; this.alertName = f JavaScript中的`call`和`apply`是两种非常重要的函数调用方式,它们允许开发者改变函数执行的上下文,即函数内部的`this`值。这两个方法的主要区别在于传递参数的方式。 `call`方法的语法是`call(obj, arg1, arg2, ...)`。第一个参数`obj`用于设置函数内部的`this`指向的对象,可以是任何对象,包括`null`(虽然在严格模式下不推荐)。后面的参数以逗号分隔,直接传入函数调用,可以是任意类型的值。 `apply`方法的语法是`apply(obj, [argsArray])`。同样,`obj`是设置`this`值的对象。不同的是,`apply`的第二个参数是一个数组或`arguments`对象,用于向函数传递一组参数。数组的元素会被作为单独的参数传入,`arguments`对象则会把所有元素作为参数传递。 这两种方法在实现类的继承时尤其有用。在JavaScript中,由于没有传统的类继承,而是基于原型的继承,`call`和`apply`可以用来模拟类的继承。例如: ```javascript function Person(name, age) { this.name = name; this.age = age; this.alertName = function() { alert(this.name); } this.alertAge = function() { alert(this.age); } } function WebDeveloper(name, age, sex) { Person.call(this, name, age); // 继承Person的属性和方法 this.sex = sex; this.alertSex = function() { alert(this.sex); } } var test = new WebDeveloper("愚人码头", 28, "男"); test.alertName(); // 输出"愚人码头" test.alertAge(); // 输出28 test.alertSex(); // 输出"男" ``` 在这个例子中,`WebDeveloper`通过`Person.call(this, name, age)`调用`Person`构造函数,使得`WebDeveloper`实例`test`能够拥有`Person`的所有属性和方法。 除了类的继承,`call`和`apply`也在回调函数中发挥重要作用。它们可以用来改变回调函数执行时的上下文,确保`this`值正确指向。例如,在处理异步操作如Ajax请求时,我们可能希望回调函数内部的`this`指向发起请求的对象,而不是全局`window`对象: ```javascript function Album(id, title, ownerId) { this.id = id; this.name = title; this.ownerId = ownerId; } Album.prototype.getOwner = function(callback) { var self = this; $.get('/owners/' + this.ownerId, function(data) { callback && callback.call(self, data.name); }); }; var album = new Album(1, '生活', 2); album.getOwner(function(owner) { alert('The album ' + this.name + ' belongs to ' + owner); }); ``` 在这个例子中,`getOwner`函数中的回调函数通过`callback.call(self, data.name)`执行,确保`this`在回调中指向`album`对象,使得`this.name`能正确访问到专辑的名字。 `call`和`apply`是JavaScript中实现动态上下文绑定和灵活参数传递的重要工具,对于理解和使用JavaScript的高级特性,如原型继承、函数封装和异步处理等,具有至关重要的地位。掌握它们的用法能够极大地提升代码的灵活性和可维护性。
- 粉丝: 6
- 资源: 929
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
评论0