浅谈JS中的call、apply、bind方法

【前言】

  在JavaScript中,callapplybindFunction对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向。

【区别】  

【主体】

(1)call

  语法:

call([thisObj[,arg1[, arg2[, [,.argN]]]]]),传递的是参数列表

  定义:

调用一个对象的一个方法,以另一个对象替换当前对象。

  作用:

call 方法可以用来代替另一个对象调用一个方法。
call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

  取值:

thisObj的取值有以下4种情况:
(1) 不传,或者传null,undefined, 函数中的this指向window对象
(2) 传递另一个函数的函数名,函数中的this指向这个函数的引用
(3) 传递字符串、数值或布尔类型等基础类型,函数中的this指向其对应的包装对象,如 String、Number、Boolean
(4) 传递一个对象,函数中的this指向这个对象

  如下所示:

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

function b(){}       

var c={name:"call"};    //定义对象c  

a.call();   //window
a.call(null);   //window
a.call(undefined);   //window
a.call(1);   //Number
a.call(‘‘);   //String
a.call(true);   //Boolean
a.call(b);   //function b(){}
a.call(c);   //Object

  再来看一个例子:

function class1(){
  this.name=function(){
    console.log("我是class1内的方法");
  }
}
function class2(){
  class1.call(this);  //此行代码执行后,当前的this指向了class1(也可以说class2继承了class1)
}   

var f=new class2();
f.name();   //调用的是class1内的方法,将class1的name方法交给class2使用

  案例2:改动this指向,借用方法

  

分析:
  在上面的代码中,我们可以看到Child里并没有introduce方法,那为什么(this.name)的值是张三丰呢?
   关键就在于最后一段代码(zs.introduce.call(zsf)),意思是把zs的方法放到zsf上执行,所以this.name 应该是 zsf。

  案例3:继承

  

注意:
    Parent.call(this,name)的意思就是使用Parent对象代替this对象,顺带继承name参数,那么Child就可以直接调用Parent的方法和属性

  案例4:继承和拓展

  

  对上面案例做下修改,可以看到,后代除了直接继承父级外,也可以自己有所拓展,两者并不冲突

  

  

(2)apply

  语法:

apply([thisObj[,argArray]])

  call和apply区别:

对于 apply、call 二者而言,作用完全一样,只是接受参数的方式不太一样。如下所示

  

  问题:call和apply方法的取舍?既然两者功能一样,那该用哪个呢?

  对此我们主要看参数数量是否固定... ...

在JavaScript 中,某个函数的参数数量是不固定的,因此要说适用条件的话,当你的参数是明确知道数量时用 call ;而不确定的时候用 apply,然后把参数 push 进数组传递进去。当参数数量不确定时,函数内部也可以通过 arguments 这个类数组对象来遍历所有的参数。

(3)bind

  语法&&兼容:

bind是在EcmaScript5中扩展的方法(IE6,7,8不支持)
bind() 方法与 apply 和 call 很相似,也是可以改变函数体内 this 的指向。

  MDN开发文档规定:

MDN的解释是:bind()方法会创建一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入 bind()方法的第一个参数作为 this,传入 bind() 方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。

  注意:

bind方法的返回值是函数

  案例:

var bar=function(){
  console.log(this.x);
}
var foo={
     x:3
}
bar();
bar.bind(foo)();
 /*或*/
var func=bar.bind(foo);
func();

输出:
undefined
3

.

原文地址:https://www.cnblogs.com/jianxian/p/12360931.html

时间: 2024-08-29 04:02:50

浅谈JS中的call、apply、bind方法的相关文章

JS中的call(),apply(),bind()方法

call,apply和bind到底有何用? 改变函数的this对象的指向 相似之处 1.都是用来改变函数的this对象指向 2.第一个参数都是this要指向的对象 3.都可以利用后续参数传参 先看下面例子: 例1: var name = "小王", age = 17; var obj = { name:"小张", objAge:this.age, myFun:function(){ console.log(this.name + "年龄" + t

浅谈js中的this关键字

浅谈js中的this关键字 全局作用域中的this 函数作用域中的this 不同函数调用方法下的this 直接调用 作为对象的方法调用 作为构造函数调用 通过call或apply方法调用 嵌套函数作用域中的this 浅谈js中的this关键字 this是JavaScript中的关键字之一,在编写程序的时候经常会用到,正确的理解和使用关键字this尤为重要.接下来,笔者就从作用域的角度粗谈下自己对this关键字的理解,希望能给到大家一些启示,权当交流之用. 全局作用域中的this 本文将以作用域由

js中的call,apply,bind区别

在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:apply . call .bind 三者都是用来改变函数的this对象的指向的:apply . call .bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文(函数的每次调用都会拥有一个特殊值--本次调用的上下文(context)--这就是this关键字的值.):apply . ca

浅谈js中继承的理解和实现

一.前言 java.C#等正统面向对象语言都会提供类似extend之类的处理类的继承的方法,而javascript并没有提供专门的方法用于继承,在javascript中使用继承需要一点技巧.js中实例的属性和行为是由构造函数和原型两部分组成的,js的继承也分为这两部分.下面给大家分享一下在js中如何实现继承,讲的不对的地方望大家指正! 二.继承构造函数中的属性和行为 我们定义两个类Animal和Bird类,来实现js中类的继承. //定义Animal类 function Animal(name)

浅谈js中this指向问题

this 指的是当前对象,如果在全局范围内使用this,则指代当前页面window:如果在函数中使用this,则this指代什么是根据当前函数是在什么对象上调用.我们可以使用call和apply改变函数中this的具体指向. console.log(this === window) // true console.log(window.alert === this.alert) // true console.log(this.parseInt("021",10)) // 21 par

浅谈Js中关于事件处理函数执行顺序的问题

Js给dom元素绑定事件的处理函数总的来说有两种方式:在html文档中绑定,在js代码中绑定. 然而,并不推荐在html标签上绑定事件. 在js代码中也可以分两种方式绑定事件: 1:通过dom元素的onclick等属性,直接绑定: 2: a.在ie下使用attachEvent/detachEvent函数的方式进行事件的绑定和取消: b.使用W3C标准的addEventListener和removeEventListener,给dom添加事件监听者和移除. 第一种方式只能绑定一个事件处理函数,后面

浅谈js中arguments对象

一.先来看看到底是个啥? arguments对象在JS中应该算数比较特殊的对象.不能显示的创建,只在当前函数调用的时候才可以使用,长得有点像数组,但绝对不是Array的实例. 几点说明: 1.1.arguments实际上是当前函数的一个内置属性,在当前函数内,函数名.arguments等价于arguments,在函数外单独使用arguments是没有意义的; 1.2.arguments对象的长度由实际参数个数决定.1.3.函数中的形参和实参是可以相互影响的. 可以看出,当传入的实参个数少于形参个

浅谈js中的九个算法

排序很多时候都会用到,而在js中排序的算法有九个是人们常用的,而且使用起来可以很流畅.本文将对这九种排序算法进行详细介绍,教程尚硅谷JavaScript DOM视频教程还有详细的代码分享哦. 一.插入排序 1)算法简介插 入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到 O(1)的额外空间的排序),因而在从后向前扫描

浅谈js中的MVC

MVC是什么? MVC是一种架构模式,它将应用抽象为3个部分:模型(数据).视图.控制器(分发器) 本文将用一个经典的例子todoList来展开 一个事件发生的过程(通信单向流动): 1.用户在视图V上与应用程序交互 2.控制器C触发相应的事件,要求模型M改变状态(读写数据) 3.模型M将数据发送到视图V,更新数据,展现给用户 在js的传统开发模式中,大多基于事件驱动的: 1.hash驱动 2.DOM事件,用来驱动视图 3.模型事件(业务模型事件和数据模型事件),用来驱动模型和模型结合 所以js