call()、apply()、arguments
一、call(),apply()
1、作为函数对象(指函数方法名,不带括号)的方法,需要通过函数对象调用;当对函数调用这两个方法时都会调用函数执行。
<script>
// 这个函数中,foo为函数对象
function foo() {
console.log(this + "——" + this.a);
}
var a = "Hello World"; foo(); // [object Window]——Hello World
foo.call(); // [object Window]——Hello World
foo.apply(); // [object Window]——Hello World
</script>
2、调用call、apply可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行时的this所指。
<script>
// 这个函数中,foo为函数对象
function foo() {
console.log(this + "——" + this.a);
}
var a = "Hello World"; var obj = {
a: "wonderful"
}
foo(); // [object Window]——Hello World
foo.call(obj); // [object Object]——wonderful
foo.apply(obj); // [object Object]——wonderful
</script>
// this对象打印后面还有内容时,会简写成[object Window]
<script>
var animal = {
type: "cat",
sayType: function() {
console.log(this.type);
}
}; var animal2 = {
type: "dog"
}; animal.sayType(); // cat
animal.sayType.call(animal2); // dog
animal.sayType.apply(animal2); // dog
</script>
这里延伸提下函数的上下文this对象
函数调用时,浏览器为我们传递两个隐含参数:函数上下文对象this、封装实参的对象arguments。
1)在函数中,this指的是全局对象window; foo()函数调用中,this为window。
2)以对象方法调用时,this指的是调用方法的对象; animal.sayType()函数调用中,this为animal。
3)使用call、apply调用时,this指的是call、apply的第一个参数;foo.call(obj)。
4)以构造函数的形式调用时,this指的是新创建的对象, 如下说明。
5)事件中,this指的是接收事件的元素,如下说明。
用于说明4)点
<script>
function Dog() {
this.type = "Animal";
this.sayType = function () {
console.log(this);
console.log(this + " belong to " + this.type);
}
}
var obj = new Dog();
obj.sayType();
// Dog {type: "Animal", sayType: ƒ}
// [object Object] belong to Animal
</script> 用于说明5)点
<button id="btn">Click</button>
<script>
document.getElementById("btn").addEventListener("click", properties);
function properties() {
console.log(this);
console.log(this.id);
}
properties(); // 因为默认全局对象为window,这个对象可以忽略不写,相当于window.properties() // 有些内容可能一开始就接触过了,但始终不能心领神会其中含义,直到有一天你坚持去了解时,醍醐灌顶的感觉
// 函数代表一种行为,要知道这个行为可以作什么需要有调用这个行为的事物。
// 比如汽车具有发动行为,启动发动这个行为车子就会动。
// 编程语言中,函数可以类比发动行为,调用函数的对象抽象类比成汽车对象。
</script>
call()和 apply()区别:
call()方法可以将实参之后依次传递;apply()方法需要将实参装到一个数组中统一传递。
二、arguments
arguments参数列表,实参列表(函数在调用时,隐含传递封装实参的类数组对象,注意是实参对象)。
arguments作为类数组对象,它可以通过索引来操作,可获取长度,在调用参数时,传递的实参都会保存在arguments中。
即使不定义形参也可以通过arguments来使用实参里某项实参。
arguments中有个属性callee,这个属性对应一个函数对象,就是当前正在执行的函数对象。
call()、apply()、arguments的更多相关文章
- 前端总结·基础篇·JS(三)arguments、callee、call、apply、bind及函数封装和构造函数
前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...
- JS中call、apply、bind使用指南,带部分原理。
为什么需要这些?主要是因为this,来看看this干的好事. box.onclick = function(){ function fn(){ alert(this); } fn();}; 我们原本以 ...
- Javascript中call、apply、bind函数
javascript在函数创建的时候除了自己定义的参数外还会自动新增this和arguments两个参数 javascript中函数也是对象,call.apply.bind函数就是函数中的三个函数,这 ...
- 图解call、apply、bind的异同及各种实战应用演示
一.图解call.apply.bind的异同 JavaScript中函数可以通过3种方法改变自己的this指向,它们是call.apply.bind.它们3个非常相似,但是也有区别.下面表格可以很直观 ...
- JavaScript中call、apply、bind、slice的使用
1.参考资料 http://www.cnblogs.com/coco1s/p/4833199.html 2.归结如下 apply . call .bind 三者都是用来改变函数的this对象的指向 ...
- JS中的call、apply、bind方法
JS中的call.apply.bind方法 一.call()和apply()方法 1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]] ...
- js中call、apply、bind那些事
前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如- 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...
- JS 中的this指向问题和call、apply、bind的区别
this的指向问题 一般情况下this对象指向调用函数的对象,全局环境中执行函数this对象指向window. function a(){ console.log(this); //输出函数a中的th ...
- 理解JS中的call、apply、bind方法(*****************************************************************)
在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...
- 聊聊call、apply、bind的故事
说到call.apply.bind,前端的胖友可是不陌生.以下就从几个方面分别聊聊它们. 是什么?(what?) 实际上它们真正的样子是这样的: Function.prototype.call(thi ...
随机推荐
- spring-boot-learning-RabbitMQ
为什么需要MQ??? 异步处理: 场景: 用户注册后,需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式 2.并行的方式` 用户注册-发送注册邮箱-发送注册短信都完成之后才结束返回给客户端 邮 ...
- vue单文件组件data选项的函数体获取vue实例对象
因配置的关系,导致 vue的data选项中存在事件.而事件无法获取 vue 的实例对象:项目是单文件形式的,以下代码只是例子 new Vue({ el:..., data:{ a: { onevent ...
- Vue基于webpack自动装载配置
Vue的自动装载配置是在 @cli/cli-service 包中,配置文件的目录在 lib/config/ 下的文件,css.js 文件是配置样式的处理,先从这里开始了解把 CSS配置流程 对应着这 ...
- thrift使用和源码分析
1 前言 thrift的官方文档比较差,很多细节没有介绍清楚,比如require.optional和default字段的区别是什么,为什么字段前面要写序号等,带着这些疑问,我们需要阅读生成的源码来了解 ...
- @Required 注解 ?
这个注解表明 bean 的属性必须在配置的时候设置,通过一个 bean 定义的显式的 属性值或通过自动装配,若@Required 注解的 bean 属性未被设置,容器将抛出 BeanInitializ ...
- BMZCTF WEB_ezeval
WEB_ezeval 进入环境,源码给出 <?php highlight_file(__FILE__); $cmd=$_POST['cmd']; $cmd=htmlspecialchars($c ...
- Demo示例——Bundle打包和加载
Unity游戏里面的场景.模型.图片等资源,是如何管理和加载的? 这就是本文要讲的资源管理方式--bundle打包和加载. 图片 Unity游戏资源管理有很多方式: (1)简单游戏比如demo,可以直 ...
- Angular2入门系列(五)———— 路由参数设置
Angular2入门系列(五)---- 路由参数设置路由配置: { path: '', component: CarProFile, children: [ { path: 'add', compon ...
- 深入理解ES6之《块级作用域绑定》
众所周知,js中的var声明存在变量提升机制,因此ESMAScript 6引用了块级作用域来强化对变量生命周期的控制let const 声明不会被提升,有几个需要注意的点1.不能被重复声明 假设作用域 ...
- C#编写程序,计算数组中奇数之和和偶数之和
编写程序,计算数组中奇数之和和偶数之和. 代码: using System; using System.Collections.Generic; using System.Linq; using Sy ...