JS中的call与apply详解
来源:互联网 发布:linux 绝对路径 编辑:程序博客网 时间:2024/05/06 06:52
在javascript中有两个方法call和apply, 这两个方法一般在js框架设计中用的比较多,比如jQuery Code。 那么,这两个方法是做什么的呢,ECMA的解释太抽象,直接看代码:
function f(){ console.log(this.name); } var obj = {}; obj.name = "obj"; f.call(obj); //obj
上述代码的执行结果是obj.
我们分析一下f, f 中输出了this.name, 这里的this指的是函数在运行时的调用者(关于JS中的this,后续会专门有一篇文章阐述),那就是说f输出的结果取决于调用它的对象,
obj 是javascript中的一个普通对象,obj.name = "obj"; 是在obj上添加了一个属性name,并赋值"obj"。 一般情况下,只有obj能访问自己的属性name,f为何能访问到obj.name呢?
call方法的作用就体现在这里,f.call(obj) 翻译成白话文就是:把f的定义赋给了obj,并调用f(),相当于obj.f() ,此时f中的this指的就是obj, this.name==obj.name,所以结果就是obj
call还有个兄弟apply, apply 和 call 唯一的区别是传递参数形式不同,call(obj,args..) 可以传递一个参数列表, apply(obj,args[]) 只能传递一个Array参数。
当然,这兄弟俩还有其他作用,那就是JS中的继承。 大家知道,JS中没有诸如Java、C#等高级语言中的extend 关键字,因此,JS中没有继承的概念,如果一定要继承的话,call和apply可以实现这个功能,看代码:
1 function Animal(name,weight){ 2 this.name = name; 3 this.weight = weight; 4 } 5 6 function Cat(){ 7 Animal.call(this,'cat','50CM'); 8 //Animal.apply(this,['cat','50CM']); 9 10 this.say = function(){11 console.log("I am " + this.name+",my weight is " + this.weight);12 }13 }14 15 var cat = new Cat();16 cat.say();//I am cat,my weight is 50CM
从输出的结果来看,Cat 确定继承了Animal中的属性, 继承的关键在于 Animal.call(this,'cat','50CM') 这句话, 翻译成白话文就是:在执行Cat()时,先在其调用对象this(暂时还不知道this是哪个对象)上赋值Animal的定义,并调用,相当于this.Animal()。
this.Animal()执行完以后,this上就产生了name和weight属性,而say方法的调用者也是this,所以say中访问的this.name就是Animal中的name属性。
那么,这个this是什么时候确定的呢?
var cat = new Cat();
这句话执行之后,this就是cat, cat.say() 就相当于this.say() 。
至于this为什么是cat, javascript中的new关键字大有来头,且等下回分解。。
- JS中的call与apply详解
- js中的call与apply
- js中的call()与apply()
- js中的apply()与call()
- js中的call与apply
- 详解js中的apply与call的用法
- 详解js中的apply与call的用法
- 详解js中的apply与call的用法
- 详解js中的apply与call的用法
- 详解js中的apply与call的用法
- js中的apply()和call()方法详解
- JS中的call、apply、bind方法详解
- JS中的call()和apply()方法详解
- js apply()与call()方法详解
- Js中apply()与call()使用详解
- Js apply() 与call() 使用详解
- js中的call与apply用法
- js中的apply与call的用法
- 讲义13:流程控制
- 俄罗斯方块
- 1041. Be Unique (20)【水题】——PAT (Advanced Level) Practise
- 讲义12:批处理、脚本、变量
- 众数问题
- JS中的call与apply详解
- 图中两个点之间的路线
- 1042. Shuffling Machine (20)【模拟】——PAT (Advanced Level) Practise
- Spring3.2+Struts2.1.8+Mybatis3.2.7 项目搭建
- 程序存储问题
- threadLocal 原理与使用
- 看京东和淘宝的地址薄设计----填写订单的场景下
- Java的多线程与线程池的使用
- C identifiers