这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值.

apply()接收两个参数:一个参数是在其中运行的作用域,另一个是参数数组(可以是Array实例,也可以是arguments对象).

实例:

function sum(num1,num2) {
return num1+num2;
} function applySum1(num1,num2) {
return sum.apply(this,arguments); } function applySum2(num1,num2) {
return sum.apply(this,[num1,num2]); } console.log(applySum1(10,10));//20
console.log(applySum2(10,10));//20

 

call()方法,第一个参数和apply()一样,是在其中运行的作用域即this;和apply()不同的是,call()方法中的其余的参数必须直接传给函数,即在使用call()方法时参数必须逐个的列出来.

实例:

function sum(num1,num2) {
return num1+num2;
} //function applySum1(num1,num2) {
// return sum.apply(this,arguments);
//
//}
//
//function applySum2(num1,num2) {
// return sum.apply(this,[num1,num2]);
//
//} function callSum1(num1,num2) {
return sum.call(this,num1,num2);
}
console.log(callSum1(10,10));//20

apply和call的区别只是除了第一个this参数外,其余参数的传递方式不一样,apply的其余的参数可以用Array实例和arguments对象传递,call的其余参数必须逐个列出.两者最后得到的结果一样.

apply和call真正的用处是扩充函数的作用域:

实例1:

//一般方法
color = "red";
var o = {color:"blue"};
function sayColor() {
console.log(this.color);
} sayColor();//red
o.sayColor();//报错
o.sayColor = sayColor;//给对象o添加一个sayColor方法,然后让其指针指向全局作用域中的sayColor函数
o.sayColor();//blue

  

实例2(call方法和apply方法一样效果):

color = "red";
var o = {color:"blue"};
function sayColor() {
console.log(this.color);
} //sayColor();//red
//o.sayColor();//报错
//o.sayColor = sayColor;//给对象o添加一个sayColor方法,然后让其指针指向全局作用域中的sayColor函数
//o.sayColor();//blue //采用apply或call方法解决对象和方法耦合的问题
sayColor.call();//red
sayColor.call(o);//blue
sayColor.call(this);//undefined
sayColor.call(window);//window is not defined

测试结果:

最后的测试结果和《javascript高级程序第3版》中的有点不一致(原因待分析):

8-16补充:全局对象window,本身就是浏览器中的对象,所以在命令行窗口下测试是不能得到书中的结果的.

浏览器下测试结果:

apply()和call()的区别的更多相关文章

  1. 瞬间记住Javascript中apply与call的区别

    关于Javascript函数的apply与call方法的用法,网上的文章很多,我就不多话了.apply和call的作用很相似,但使用方式有区别 apply与call的第一个参数都是一个对象,这个对象就 ...

  2. 改变this指针的apply,call,bind的区别

    apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. Jav ...

  3. 【JavaScript】apply和call的区别在哪?

    我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家 ...

  4. android SharedPreferences apply和commit的区别

    1.apply没有返回值而commit返回boolean表明修改是否提交成功2.apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘3.apply ...

  5. JavaScript之apply()和call()的区别

    我 在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示 例,总算是看的有点眉目了,在这里我做如下笔记,希望和 ...

  6. JS 中的this指向问题和call、apply、bind的区别

    this的指向问题 一般情况下this对象指向调用函数的对象,全局环境中执行函数this对象指向window. function a(){ console.log(this); //输出函数a中的th ...

  7. .call() 和 .apply() 的含义和区别

    JavaScript中apply与call的用法意义及区别 apply()与call()的区别 javascript中apply和call方法的作用及区别说明 .apply()用法和call()的区别 ...

  8. apply 和call 的区别,apply实用小技巧

    Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

  9. this+call、apply、bind的区别与使用

    http://www.ruanyifeng.com/blog/2018/06/javascript-this.html https://segmentfault.com/a/1190000018017 ...

随机推荐

  1. ReentrantLock获取锁方式解读(转)

    原文地址:http://www.zhihu.com/question/36771163 (一) lock()方法获取锁.如果该锁没有被另一个线程保持,则获取该锁并立即返回,将锁的保持计数设置为 1.如 ...

  2. 非常基础的css注意点

    排版了很多页面,才发现自己忽视了一个很基本且重要的知识点: 一个div在一般的浏览器中,算它的width,要计算其content,padding,border. 但是在CSS中定义一个div的widt ...

  3. UI学习笔记---第四天

    事件处理 事件概述 UIEvent:事件,是由硬件捕捉的一个表示用户操作设备的对象 分三类:触摸事件\  晃动事件\ 远程控制事件 触摸事件:会包含1个到多个触摸点 实现触摸 UIView支持触摸事件 ...

  4. Sobel边缘检测算法(转载)

    转载请注明出处:  http://blog.csdn.net/tianhai110 索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰 ...

  5. 2016 ACM/ICPC Asia Regional Shenyang Online 1009/HDU 5900 区间dp

    QSC and Master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  6. Android加载网络图片的工具类

    ImageView加载网络的图片 HttpUtil.java package com.eiice.httpuimagetils; import java.io.ByteArrayOutputStrea ...

  7. tools/build.c

    /* *  linux/tools/build.c * *  Copyright (C) 1991, 1992  Linus Torvalds */ /* * This file builds a d ...

  8. JS初学之-if else图片顺序及循环切换

    初学JS,代码还需多多改进,自学中... <!doctype html><html><head><meta charset="utf-8" ...

  9. phpwind8.7升级9.0.1过程(四)20130207升级到20141228

    每一次升级前都要注意备份 1.网站根目录的所有文件 2.网站的数据库 根据phpwind官方教程 更新到20130702版本成功并备份 更新到20140428版本成功并备份 20141228版本的更新 ...

  10. UVALive-4670 Dominating Patterns(AC自动机)

    题目大意:找出出现次数最多的模式串. 题目分析:AC自动机裸题. 代码如下: # include<iostream> # include<cstdio> # include&l ...