apply()和call()的区别
这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内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()的区别的更多相关文章
- 瞬间记住Javascript中apply与call的区别
关于Javascript函数的apply与call方法的用法,网上的文章很多,我就不多话了.apply和call的作用很相似,但使用方式有区别 apply与call的第一个参数都是一个对象,这个对象就 ...
- 改变this指针的apply,call,bind的区别
apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. Jav ...
- 【JavaScript】apply和call的区别在哪?
我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家 ...
- android SharedPreferences apply和commit的区别
1.apply没有返回值而commit返回boolean表明修改是否提交成功2.apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘3.apply ...
- JavaScript之apply()和call()的区别
我 在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示 例,总算是看的有点眉目了,在这里我做如下笔记,希望和 ...
- JS 中的this指向问题和call、apply、bind的区别
this的指向问题 一般情况下this对象指向调用函数的对象,全局环境中执行函数this对象指向window. function a(){ console.log(this); //输出函数a中的th ...
- .call() 和 .apply() 的含义和区别
JavaScript中apply与call的用法意义及区别 apply()与call()的区别 javascript中apply和call方法的作用及区别说明 .apply()用法和call()的区别 ...
- apply 和call 的区别,apply实用小技巧
Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...
- this+call、apply、bind的区别与使用
http://www.ruanyifeng.com/blog/2018/06/javascript-this.html https://segmentfault.com/a/1190000018017 ...
随机推荐
- ReentrantLock获取锁方式解读(转)
原文地址:http://www.zhihu.com/question/36771163 (一) lock()方法获取锁.如果该锁没有被另一个线程保持,则获取该锁并立即返回,将锁的保持计数设置为 1.如 ...
- 非常基础的css注意点
排版了很多页面,才发现自己忽视了一个很基本且重要的知识点: 一个div在一般的浏览器中,算它的width,要计算其content,padding,border. 但是在CSS中定义一个div的widt ...
- UI学习笔记---第四天
事件处理 事件概述 UIEvent:事件,是由硬件捕捉的一个表示用户操作设备的对象 分三类:触摸事件\ 晃动事件\ 远程控制事件 触摸事件:会包含1个到多个触摸点 实现触摸 UIView支持触摸事件 ...
- Sobel边缘检测算法(转载)
转载请注明出处: http://blog.csdn.net/tianhai110 索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰 ...
- 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) ...
- Android加载网络图片的工具类
ImageView加载网络的图片 HttpUtil.java package com.eiice.httpuimagetils; import java.io.ByteArrayOutputStrea ...
- tools/build.c
/* * linux/tools/build.c * * Copyright (C) 1991, 1992 Linus Torvalds */ /* * This file builds a d ...
- JS初学之-if else图片顺序及循环切换
初学JS,代码还需多多改进,自学中... <!doctype html><html><head><meta charset="utf-8" ...
- phpwind8.7升级9.0.1过程(四)20130207升级到20141228
每一次升级前都要注意备份 1.网站根目录的所有文件 2.网站的数据库 根据phpwind官方教程 更新到20130702版本成功并备份 更新到20140428版本成功并备份 20141228版本的更新 ...
- UVALive-4670 Dominating Patterns(AC自动机)
题目大意:找出出现次数最多的模式串. 题目分析:AC自动机裸题. 代码如下: # include<iostream> # include<cstdio> # include&l ...