浅谈JavaScript的apply和call语句

我们试图在回调函数中,用this表示oDiv对象,这样感觉爽。


1    animate(oDiv,{"left":600},2000,function(){

2        this.style.backgroundColor = "red";

3    });

但是不行,回调函数中this不是oDiv。

所以我们现在要想一个办法,让callback运行,并且callback里面的this是oDiv。


1    callback.call(elem);

或者:


1    callback.apply(elem);

执行callback函数,并且让callback函数中的this关键字为elem。

例子:


1            var obj2 = {

2                 "name" : "树懒",

3                 "age" : 16,

4                 "sex" : "男"

5            }

6

7            function xianshixinxi(){

8                 alert(this.name);

9            }

10

11           //下面这个call语句的含义有两层:

12           //1. xianshixinxi函数将被调用

13           //2. 同时这个函数内部的this就是obj了

14           xianshixinxi.call(obj2);

说白了apply、call功能是一样的,功能都是:让函数调用,并且给函数设置this是谁。

call就是英语呼叫的意思,apply是应用的意思。

现在说说区别:


1   
        var
obj = {

2   
             "name"
: "考拉",

3   
             "age"
: 18,

4   
             "jiehun"
: false

5   
        }

6

7

8   
        function
xianshixinxi(a,b,c){

9   
             console.log(this.name);

10  
             console.log(a
+ b + c);

11  
        }

12

13  
        xianshixinxi.call(obj,2,3,4);

14  
        xianshixinxi.apply(obj,[2,3,4]);

call和apply功能一样,就是让一个函数里面的this设置为一个对象。

拿上例来说,xianshixinxi函数里面的this就是obj对象。但是我们发现,xianshixinxi这个函数,有参数。那么我们现在又想设置this是谁,又想把参数往里传,此时就有区别了:


1   
fn.call(obj,参数1,参数2,参数3……);


1   
fn.apply(obj,[参数1,参数2,参数3……]);

call需要你用逗号罗列所有参数,但是apply是把所有参数写在数组里面。即使只有一个参数,也必须写在数组里面。

比如:


1   
        function
showInfo(n){

2   
             for(var
i = 1 ; i <= n ; i++){

3   
                 console.log(this.name);

4   
             }

5   
        }

6   
        showInfo.call(obj,10);

7   
        showInfo.apply(obj,[10]);

一定不要记混,apply要的是数组,你想啊,ly、ly、ly长得像list,就是数组。

总结一下,这两个东西功能一致,就是把一个函数里面的this设置为某个对象。区别就是后面的参数的语法。

时间: 2024-11-05 02:21:00

浅谈JavaScript的apply和call语句的相关文章

浅谈 JavaScript 编程语言的编码规范

对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编码规范也往往被轻视,开发过程中修修补补,最终也就演变成为后续维护人员的恶梦.软件存在的长期价值直接与编码的质量成比例.编码规范能帮助我们降低编程中不必要的麻烦.而 JavaScript 代码是直接发送给客户浏览器的,直接与客户见面,编码的质量更应该受到关注. 本文浅谈 JavaScript 编程中关

浅谈javascript继承【读javascript设计模式第四章节继承有感】

javascript继承,无任是类式继承,原型式继承还是渗元式继承都是通过不同方法去围绕着prototype转,简单分析下三种不同继承方法是如何围绕prototype转的 一:类似继承,先上关键代码 function extend(subClass,supClass){ var fn = function(){}; fn.prototype = supClass.prototype; subClass.prototype = new fn(); subClass.prototype.constr

浅谈JavaScript运行机制

浅谈JavaScript运行机制 ? 想要了解一门语言,最好的办法就是了解它的运行机制.掌握了运行机制,能够让我们在开发中少走许多弯路,写出高质量的代码.本文简单介绍什么是JavaScript的运行机制,给刚刚接触JavaScript的小白一个初步的了解,为将来打好基础. 一.JavaScript 代码运行分两个阶段: 1.预解析---把所有的函数定义提前,所有的变量声明提前,变量的赋值不提前 2.执行---从上到下执行(按照js运行机制) 二.JavaScript运行机制的特点 1.JavaS

浅谈javascript单体【读javascript设计模式第五章节单体有感】

单体,整个运行环境就独有一份,最简单的一种单体就是一个把所有属性和方法都集中在一起的对象,区别于一般的字面量对象,一般字面量对象是对一个物体的描述,集合该物体所具有的一些属性和方法,而单体则包含更多的些逻辑在里面,单体的好处有,划分命名空间,如果用来作为网页包装器,可以使得页面所有变量都封装在一个对象里,大幅度减小网页里的全局变量, 代码如: common.js (function(wz){ $.extend({ init:function(){ var self = this; this.bi

《浅谈JavaScript系列》系列技术文章整理收藏

<浅谈JavaScript系列>系列技术文章整理收藏 1浅谈JavaScript中面向对象技术的模拟 2浅谈javascript函数劫持[转自xfocus]第1/3页 3浅谈javascript 面向对象编程 4老鱼 浅谈javascript面向对象编程 5浅谈javascript的数据类型检测 6浅谈Javascript嵌套函数及闭包 7根据一段代码浅谈Javascript闭包 8浅谈JavaScript编程语言的编码规范 9浅谈Javascript面向对象编程 10浅谈JavaScript

浅谈javascript函数劫持

http://www.xfocus.net/articles/200712/963.html 浅谈javascript函数劫持 文章提交:hkluoluo (luoluonet_at_hotmail.com) by luoluo on 2007-11-30 luoluonet_at_yahoo.cn http://www.ph4nt0m.org 一.概述 javascript函数劫持,也就是老外提到的javascript hijacking技术.最早还是和剑心同学讨论问题时偶然看到的一段代码,大

浅谈JavaScript中的原型模式

在JavaScript中创建对象由很多种方式,如工厂模式.构造函数模式.原型模式等: <pre name="code" class="html">//工厂模式 function createPerson(name,age,job) { var o = new Object; o.name = name; o.age = age; o.job = job; o.sayName = function() { alert(this.name); } retur

浅谈javascript的原型及原型链

浅谈javascript的原型及原型链 这里,我们列出原型的几个概念,如下: prototype属性 [[prototype]] __proto__ prototype属性 只要创建了一个函数,就会为该函数创建一个prototype属性,指向该函数的原型对象.实例对象是不会拥有该属性的.默认情况下,该原型对象也会获得一个constructor属性,该属性包含一个指针,指向prototype属性所在的函数. Person.prototype.constructor===Person [[proto

浅谈JavaScript的面向对象和它的封装、继承、多态

写在前面 既然是浅谈,就不会从原理上深度分析,只是帮助我们更好地理解... 面向对象与面向过程 面向对象和面向过程是两种不同的编程思想,刚开始接触编程的时候,我们大都是从面向过程起步的,毕竟像我一样,大家接触的第一门计算机语言大概率都是C语言,C语言就是一门典型的面向过程的计算机语言.面向过程主要是以动词为主,解决问题的方式是按照顺序一步一步调用不同的函数.面向对象是以名词为主,将问题抽象出具体的对象,而这个对象有自己的属性和方法,在解决问题的时候,是将不同的对象组合在一起使用. //面向过程装