一、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,这个属性对应一个函数对象,就是当前正在执行的函数对象。



最新文章

  1. C#并行编程-线程同步原语
  2. 《自制编程语言》笔记:使用yacc与lex制作简单计算器
  3. java 定义mysql树形菜单
  4. python使用一个集合代替列表
  5. android:layout_gravity=&quot;bottom&quot;不起作用问题
  6. Hibernate-----关系映射 重点!!!
  7. 关于C++ 循环
  8. ASP.NET性能调试
  9. HDU - 3247 Resource Archiver (AC自动机,状压dp)
  10. 剑指Offer_编程题_22
  11. 迅速的说清楚rpc原理
  12. Swift 学习- 09 -- 枚举
  13. java 偏向锁、轻量级锁及重量级锁synchronized原理
  14. 学习Spring Boot:(二十六)使用 RabbitMQ 消息队列
  15. 无线渗透开启WPS功能的路由器
  16. 活字格Web应用平台学习笔记1 - 下载安装,ready go
  17. C++中的class (1)
  18. Python爬虫之HTTP和HTTPS
  19. Linux入门基础(四):Linux网络基本配置
  20. 温故而知新:什么是wcf

热门文章

  1. GC 是什么?为什么要有 GC?
  2. mac 修改环境变量bash_profile除了cd用不了其他命令,又关闭了终端
  3. 学习openldap03
  4. 基于redis实现未登录购物车
  5. 树莓派安装ros
  6. 模型预测控制(MPC)简介
  7. 原生ES6写的Web游戏:ES6-Mario,小美女,小帅哥快来玩啊~~
  8. 从kill-chain的角度检测APT攻击
  9. PAT B1056组合数的和
  10. 解决webpack项目中打包时候内存溢出的bug JavaScript heap out of memory