首页 新闻 会员 周边

javascript中的call提问

0
[已解决问题] 解决于 2014-01-19 15:05

function add(a,b)
{
    alert(a+b);
}
function sub(a,b)
{
    alert(a-b);
}

add.call(sub,3,1); //这是什么意思.

add.call(null,3,1);//这又是什么意思.

这上面的这2个继承是如何执行的.

思思博士的主页 思思博士 | 菜鸟二级 | 园豆:224
提问于:2013-12-22 16:20
< >
分享
最佳答案
1

我用Java的概念说一下哈,不一定合理。有一个类Math,其中有N多数学函数,什么加减乘除开方乘方...咱都不管,只要其中的int add(int a, int b); int sub(int a, int b);这两个方法。那么我们在写代码的时候,是不是这样写的呢?

Math m = new Math();
int c = m.add(1, 2);
int d = m.sub(3, 4);

这几句代码楼主应该没什么意见吧,那么理解起来就是对象调用它的方法。

在回到楼主的问题上来,你的那段代码也同样是这个意思,对象调用它的方法。当然,可能楼主一下子难以理解。怎么函数还变成对象了,函数还有方法了。。。

这个我只能简单的说说了,复杂的我也说不明白了,首先是js中一切皆对象,比Java还要彻底。而且没有类这个概念,还有一点就是js是函数式语言,虽然我也不太明白什么是函数式语言,但是看多了文章,感觉还是和Java不一样的。

再回到js中没有类,Java中有类,所以我们获取对象可以new一个对象,实际上我们都是被Java毒害了,为什么我们看到Math m = new Math();这句代码就知道我们得到了一个Math类型的对象,好像一点也不怀疑,从来也没有想过底层发生了什么。扯远了,实际上我想说的就是得到一个对象最本质的其实是在内存中开辟了一块空间,然后这块地方存放了具有一定数据结构的数据,他就是对象了。至于Java是怎么通过Math m = new Math();这句代码实现开辟空间并且初始化的,咱还是不用理会,但是只要理解一点,各个语言得到对象的语法不一样,但是本质一样。

再说js怎么得到对象,方法有很多,这就不像Java中只有new这一种方法,反射算不算?不清楚。

方法一:new Object(); 得到一个Object对象。

方法二:Object.create(); 不太懂。。。

方法三:对象直接量,var a = {}; var b = [];

方法四:这个算不算我在瞎编啊,function functionName(args){} 得到一个函数对象

不知道还有没有其他途径来得到对象了。。。

既然函数式一个对象,那么他就有属性和方法,再回到Math m = new Math(); 因为m的类型是Math。所以m具有Math类中定义的那些(非静态)方法。看过js现在一想,不对啊,对象的方法怎么跑到类中来了,虽然有一个关键字static来标志该方法到底是属于类的还是对象的,但是感觉还是别扭。

再回到js,new Object();那么这个对象就是Object类型的,具有Object的所有方法,那么函数的类型是什么呢?是Function,所有用户定义的函数都是Function类型的对象,具有Function的所有方法。不巧其中正好有一个方法叫做call()

那么现在就好理解了,add这个函数对象在调用它自己的call()方法,对于这一点,不知道我有没有说清楚了,不管你清没清楚,反正我是清楚了。。。其实还有许多我也不是非常懂的,比如函数是Function,为什么就有了Function的方法?Function本身也是一个函数,那么它又是什么类型的。。。

最后一点就是call()方法具体实现的功能,哎呀,刚才这个call()方法具体功能写错了,望文生义了,乘着没人发现赶紧改过来,丢人了。楼主自己百度吧。

由于我JavaScript权威指南这本书还没看完,TM太难了,所以理解的还有限,希望没有误导到你。

奖励园豆:5
ThreeTree | 小虾三级 |园豆:1490 | 2013-12-22 17:58

  你即学习js也学习java吗?

思思博士 | 园豆:224 (菜鸟二级) | 2013-12-25 18:16

 Function是一个构造器函数,当然是从Object的原形中继承过来的啊.从这层意思上来说的话它是Object类型.可以用 instanceof测试一下.

Function也是一个普通方法,从基本类型上来说的话它是function类型.可以用typeof测试一下.

思思博士 | 园豆:224 (菜鸟二级) | 2013-12-25 18:22

@思思博士: 都得学啊,看来你挺了解JS的啊

ThreeTree | 园豆:1490 (小虾三级) | 2013-12-25 21:07

@ThreeTree: 给你推荐基本好书吧.javascript面向对象

第二本书:是国内的delphi专家周爱民写的<<javascript精髓于实践(第二版)>>.

第二本书上几乎每句话都是思想.如果能坚持看完,看懂,那么你也就差不多了.

我只是觉得学得太多的话,很难做到精通,所以不太敢去搞那么多的技术.我以前还是.NET程序员呢.

思思博士 | 园豆:224 (菜鸟二级) | 2013-12-26 12:41

@思思博士: 3q,学多了确实很难精通,我发现自己这学点,那学点,都忙不过来了,不过看看别人的文章,发现还都是需要学习的,html+css+js这一套,再加上Java,路还很长呢。做项目主要是Java了,但是界面都是自己写嘛,所以就得了解了。发现光java就够学的了,首先是一堆框架,webservice,操作word,多线程。头都大了,发现自己除了了解一下Java语法,其余的都没研究过

ThreeTree | 园豆:1490 (小虾三级) | 2013-12-26 12:52

@ThreeTree: 那你就专心研究java.到30岁了,那个25万应该没什么问题了吧

思思博士 | 园豆:224 (菜鸟二级) | 2014-01-19 15:04
其他回答(4)
0

详细概念建议你看看http://product.china-pub.com/199271#ml JavaScript权威指南 这个经典书

call apply 作用区等问题,否则从c/c++等其语言不好理解,这个是函数式语言范型

2012 | 园豆:21230 (高人七级) | 2013-12-22 16:40

 你是打广告的么?

支持(0) 反对(0) 思思博士 | 园豆:224 (菜鸟二级) | 2013-12-22 17:24
1

学习了

男人要爽 | 园豆:6 (初学一级) | 2013-12-22 18:30

  妈的  你这名字怎么这么邪恶

支持(0) 反对(0) 思思博士 | 园豆:224 (菜鸟二级) | 2013-12-25 18:38
-1
谦行 | 园豆:473 (菜鸟二级) | 2013-12-23 09:34

 好经典的回答

支持(0) 反对(0) 思思博士 | 园豆:224 (菜鸟二级) | 2013-12-25 18:22

@思思博士: 一百度就有的答案,何必上来问

支持(0) 反对(0) 谦行 | 园豆:473 (菜鸟二级) | 2013-12-25 18:35

@dolphinX: 其实我想问这个继承具体哪些地方会用到.怎么用的,百度里面是没这个的.

支持(0) 反对(0) 思思博士 | 园豆:224 (菜鸟二级) | 2013-12-25 18:37
0

add.call(sub,3,1); 就是在add函数中把sub代替this

add.call(null,3,1);  这个情况this应该是window对象吧,我猜 的,你可以试试在add函数中加一个alert(this);就知道是什么了。搞定,收工。

angelshelter | 园豆:9887 (大侠五级) | 2013-12-23 22:06

  你说的是都是对的.尤其是这句:add函数中把sub代替this.好经典

支持(0) 反对(0) 思思博士 | 园豆:224 (菜鸟二级) | 2013-12-25 18:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册