基础知识不是你看了一遍书或者两篇文章就能掌握的。

之前看书看文章时,感觉自己看懂了就掌握了。呵呵!too young!too naive!

以前的坑还是要一铲一铲的填上的。

高程上面关于apply和call的知识点:

apply和call,这两个方法的用途都是在特定作用域中调用函数,实际上等于设置函数体内this对象的值(this 指当前对象,也就是正在调用这个函数的对象。)。

apply方法

apply方法接收两个参数:一个是在其中运行函数的作用域(this),另一个是参数数组。其中,第二个参数(可选)可以是Array的实例,也可以是arguments对象。

用apply改变this:

var jack = {
name:'jack',
age:28,
sayName:function() {
console.log(this.name);
}
};
var juli = {
name:'juli',
age:25
};
jack.sayName();//jack
jack.sayName.apply(juli);//juli

用apply改变this并传入第二个参数

var ryo = {
name:'隆',
learn:function(para) {
this.shill = para;
}
};
var ken = {
name:'肯'
}
//通过ryo的learn方法让ken学会波动拳
ryo.learn.apply(ken,['波动拳']);

call方法

call方法与apply方法的作用相同,他们的区别仅在于接收参数的方式不同。

对于call方法,第一个参数与apply方法的第一个参数意义相同。不同的是,在使用call方法时,传递给函数的参数必须逐个列举出来。

把上面的两个例子用call改写,结果完全一样。注意两者传入函数的参数的方式不同。

bind方法

bind方法会创建一个调用bind方法的函数的实例(返回一个绑定函数),该函数实例(绑定函数)的this为传入bind方法的第一个参数。当使用new 操作符调用该函数实例(绑定函数)时,第一个参数无效。

通过bind方法还可以预设返回的函数实例(绑定函数)的参数,方法是给bind方法传入除第一个参数以外的参数。

用bind创建一个原函数的实例:

var name = 'window对象';

function originalFun(para1,para2) {
console.log(arguments);
console.log(para1 + para2);
console.log(this.name);
} var funOne = originalFun.bind(); funOne(3,4);

调用funOne函数的输出结果:

创建funOne函数时,没有向bind方法中传入参数,funOne的this被设为window对象。

不过在严格模式下,不传入参数,返回的函数实例的this不会被设为window,以上代码运行时会报错 'Cannot read property 'name' of undefined'。

用bind创建一个原函数的实例并绑定一个this:

var name = 'window对象';
var person = {
name:'Gilbert',
age:15
}; function originalFun(para1,para2) {
console.log(arguments);
console.log(para1 + para2);
console.log(this.name);
} var funTwo = originalFun.bind(person); funTwo(5,6);

调用funTwo函数的输出结果:

用bind创建一个原函数的实例并绑定一个this和预设第一个参数:

var name = 'window对象';
var person = {
name:'Gilbert',
age:15
}; function originalFun(para1,para2) {
console.log(arguments);
console.log(para1 + para2);
console.log(this.name);
} var funThree = originalFun.bind(person,10); funThree(40);

调用funThree函数的输出结果:

用new操作符调用绑定函数时,会忽视传入bind方法的第一个参数。

下面的例子根据MDN的例子改编而来:

var math = {
name:'jojo'
}
function Point(x, y) {
this.x = x;
this.y = y;
} Point.prototype.toString = function() {
console.log(this);
console.log(this.x + ',' + this.y);
};
var CopyPoint = Point.bind(math,0);
var aPoint = new CopyPoint(10);
aPoint.toString();//输出:{x:0, y:10} 0,10

承接上面的代码,不用new操作符调用绑定函数:

//不用new操作符调用绑定函数
CopyPoint(20);
console.log(math);//输出:{name:'jojo', x:0, y:20}

结束语

以上内容只是总结了apply、call、bind的最基础的知识,要想在项目中熟练地使用这三个方法还要有一定的经验积累。

(完)

相关文章:

1.【优雅代码】深入浅出 妙用Javascript中apply、call、bind

参考文章:

1.Function.prototype.call()

2.Function.prototype.apply()

3.Function.prototype.bind()

4.Javascript 严格模式详解

关于apply、call和bind的总结的更多相关文章

  1. 动态作用域与this +apply和call +bind

    词法作用域是一套关于引擎如何寻找变量以及会在何处找到变量的规则. (函数作用域和块作用域) JavaScript 中的作用域就是词法作用域,也就是静态作用域,由定义代码决定 动态作用域似乎暗示有很好的 ...

  2. js call apply caller callee bind

    call apply bind作用类似.即调用一个对象的一个方法,以另一个对象替换当前对象. call 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) ...

  3. JavaScript方法call,apply,caller,callee,bind的使用详解及区别

    一.call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容). 即  “某个方法”当做“指定的某个对象”的“方法”被执行. Js代 ...

  4. 前端见微知著JavaScript基础篇:你所不知道的apply, call 和 bind

    在我的职业生涯中,很早就已经开始使用JavaScript进行项目开发了.但是一直都是把重心放在了后端开发方面,前端方面鲜有涉及.所以造成的一个现象就是:目前的前端知识水平,应付一般的项目已然是足够的, ...

  5. JS中的call()和apply()方法和bind()

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  6. 浅谈JavaScript中的apply,call和bind

    apply,call,bine 这三兄弟经常让初学者感到疑惑.前两天准备面试时特地做了个比较,其实理解起来也不会太难. apply MDN上的定义: The apply() method calls ...

  7. JavaScript 构造函数 prototype属性和_proto_和原型链 constructor属性 apply(),call()和bind() 关键字this

    1.构造函数: 通常构造函数首字母需要大写,主要是为了区别ECMAScript的其它函数.(高程三 P145) 构造函数与其他函数的唯一区别,就在于调用它们的方式不同.只要通过new来调用,任何函数都 ...

  8. 彻底理解了call()方法,apply()方法和bind()方法

    javascript中的每一个作用域中都有一个this对象,它代表的是调用函数的对象.在全局作用域中,this代表的是全局对象(在web浏览器中指的是window).如果包含this的函数是一个对象的 ...

  9. apply,call和bind的用法区别

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. this、apply/call、bind、闭包、函数、变量复制

    一.实际场景中抽象出的一个问题 下面this各指向什么? var a = { b: function() { console.log(this); }, f: function() { var c = ...

随机推荐

  1. HBase表预分区

    在创建Hbase表的时候默认一张表只有一个region,所有的put操作都会往这一个region中填充数据,当这个一个region过大时就会进行split.如果在创建HBase的时候就进行预分区则会减 ...

  2. python多线程为什么不能利用多核cpu

    GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程序会产生什么样的影响?我们先来看一个问题.运行下面这段 python 程序,CPU 占用率是多少? # 请勿在工作 ...

  3. Z-score标准化[转载]

    转自:https://blog.csdn.net/Orange_Spotty_Cat/article/details/80312154 1.意义 Z-Score通过(x-μ)/σ将两组或多组数据转化为 ...

  4. google chrome插件开发,自己动手,丰衣足食

    因为平时上网都用chrome,但总感觉除了速度快,简洁以外总还有地方满足不了我的需要,然后找插件…后来发现,插件虽然海量但找个称心如意的也不是件容易的事儿,用在找插件的时间都能自己写一个了,于是,今年 ...

  5. shoes的安装前后(一)

    最近看到一个模型用到了shoes,准备自己试一试.搞了半天,也安装不成功.直接安装包,gem install shoes,失败, 从rubygems上下载最新版本的shoes 然后安装,成功了.随便写 ...

  6. js中 a : function(){}这是什么格式? 代表什么含义?怎样学习这样的格式?

    js中的json. 一种轻量级数据格式.json中的值是map形式的就是key->value. 具体看下边的示例; var person = { // 用 大括号括声明一个json. " ...

  7. bootstrap详解 见网址

    http://caibaojian.com/bootstrap/base-css.html?#forms

  8. EditPlus 4.3.2487 中文版已经发布(11月12日更新)

    新的版本修复了粘贴多重选择文本的问题,以及增加了横向扩展列选模式选择范围的快捷键(Ctrl+Alt+→/←).

  9. kafka环境安装

    源码包下载: http://archive.apache.org/dist/kafka/1.0.0/ 集群环境: master 192.168.1.99 slave1 192.168.1.100 sl ...

  10. JavaWeb实现分页的四种方法

    一.借助数组进行分页 原理:进行数据库查询操作时,获取到数据库中所有满足条件的记录,保存在应用的临时数组中,再通过List的subList方法,获取到满足条件的所有记录. 实现: 首先在dao层,创建 ...