文档章节

javascript中的this、apply、call用法解析

stone_
 stone_
发布于 2016/05/19 15:31
字数 422
阅读 16
收藏 0

在Javascript中,this指向函数执行时的当前对象。值得注意,该关键字在Javascript中和执行环境,而非声明环境有关

这里的重点是执行时

eg:

function aa(){
    console.log(this);  // 现在不能确定this指针所指向的对象。你会说window?
}

aa(); // 这时候的确是window


var bb = {
aa: aa

}

bb.aa() // 返回的就是Object了


var aaa = bb.aa;

aaa() //那么这时候this又变成window了

理解了this的指向,那么我们讨论一下call和apply 的用法,其实两个是一样的,只不过参数传递形式不同,在这里就不讨论了。

call和apply能够强制改变函数执行时的当前对象,让this指向其他对象。拿apply做例子。

var name = 'window';
var aa = function(){
console.log(this.name)

};
aa() // window

var bb = {
name:'javascript',
aa:aa

}
bb.aa()  // javascript  验证了之前this的定义


bb.aa.apply(this) // window 又变成了window


bb.aa()方法中this本来是指向对象bb的,apply修改了bb.aa()方法中this的指向,指向了window。理解了this,apply就自然懂了。

apply常见用法:

1. 偷取方法。


function aa(){
//获取第一个参数

return arguments[0];

}
aa(1, 2, 3)
//在JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性。arguments非常类似Array,但实际上又不是一个Array实例



//上述的方法只能获取一个,如果我想截取一段呢?用Array对象的splice方法多好,是吧?

function aa(){

 // return arguments.splice(1,2) 会报错的,arguments是对象,没有splice方法
return Array.prototype.splice.apply(arguments,[1 ,2]); 

}

aa(1, 2, 3) //[2, 3]  把数组对象的方法偷过来了吧、、、

 

 

© 著作权归作者所有

stone_
粉丝 21
博文 221
码字总数 163611
作品 0
洛阳
程序员
私信 提问
JavaScript中call()与apply()有什么区别?

今天读《JavaScript权威指南》时发现其中有段代码用到了apply方法用于递归实现数组的展开。可是我不懂这个函数的用法,因此查了一下,将资料整理如下。 Javascript的每个Function对象中有一个...

小微
2012/08/27
6.5K
1
JavaScript中call()与apply()区别

我有时发现有道云笔记其中有段代码用到了apply方法用于递归实现数组的展开。可是我不懂这个函数的用法,因此查了一下,将资料整理如下。 Javascript的每个Function对象中有一个apply方法: ...

唐俊-
2013/12/30
151
0
JS高级之面试必须知道的几个点

深圳市人人聚财招前端啦 ~~~ 招前端,招前端,招前端,欢迎扫描加群,砸简历过来: 前言 这段时间突然发现JS原生好多东西都忘记了,但有些东西确实很重要,所以又重新再梳理一次。主要有函数的...

小小小
2018/06/08
0
0
几个积累的javascript和css的技巧2

document.createElement()的用法 document.createElement()是在对象中创建一个对象,要与appendChild() 或 insertBefore()方法联合使用。其中,appendChild() 方法在节点的子节点列表末添加新...

王小明123
2013/07/14
233
0
JS学习笔记之再理解一等公民--函数(基础篇)

定义函数的方式 两种方式: 函数表达式 函数声明语句 注:"[]"里的内容代表可选 区别一:函数表达式可以是匿名函数,函数声明必须要有函数名 例1: 对于有函数名的函数表达式,函数名的作用域...

大柚子08
2018/05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用TensorFlow的AI程序运行报错AttributeError: module 'tensorflow' has no attribute 'xxx'

使用TensorFlow的AI程序,在运行时报错AttributeError: module 'tensorflow' has no attribute 'xxx',首先检查是否是包路径不对,一般是版本变化所致。...

织梦之魂
今天
3
0
提示浏览器版本低

本文转载于:专业的前端网站➭提示浏览器版本低 网站网页在遇到浏览器低版本(尤其是IE浏览器)时,提示浏览器版本低(如IE8以及以下),建议用户升级浏览器以获得最好体验。以下是代码: 1...

前端老手
今天
6
0
CentOS 7系统增加swap

转载请注明文章出处:CentOS 7系统增加swap swap是位于磁盘上的特殊文件(或分区),属于“虚拟内存”的一部分。通俗点就是内存的备胎,内存充足的情况下,基本上没swap什么事(和设置有关)...

tlanyan
今天
6
0
基于Prometheus和Grafana的监控平台 - 环境搭建

相关概念 微服务中的监控分根据作用领域分为三大类,Logging,Tracing,Metrics。 Logging - 用于记录离散的事件。例如,应用程序的调试信息或错误信息。它是我们诊断问题的依据。比如我们说...

JAVA日知录
今天
6
0
PHP运行时全局构造体

struct _php_core_globals { zend_bool magic_quotes_gpc; // 是否对输入的GET/POST/Cookie数据使用自动字符串转义。 zend_bool magic_quotes_runtime; //是否对运行时从外部资源产生的数据使...

冻结not
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部