浏览 1268 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2007-09-21
js与c++
最近研究了下vc,对比了下c与js,很多异同,下面列举一下吧 1.c++下面函数声明不用写function js必须 2.c++下面函数调用如果在函数声明后,则与js一样,但是如果调用在前,声明在后,则必须写原形声明,js当中不必(不是好习惯,尤其调用在一个script里面,声明在后面script标记里,很可能出问题,这点还是c++好) 3.c++强类型,有mem系列函数操作内存,有sizeof一系列内存方法(由baidu考试学习来),js由于弱类型,又是普遍对象化变量,实现非常简单 4.cout的<<很形象<<后面再<<再<<很有流的感觉,就象js当中.一层处理,再.一层,语言相似处很多 5.c++所有{}都是scope,比如if(1){int a=123;}cout<<a;报错,但是js里面if(1){var a=123}alert(a)没问题,因为js只支持function的scope其他函数内部{}不算scope 对于js不需原形声明的研究 aaa(); function(){ alert(123); } 正常 aaa(); var www=123; function(){ alert(this.www); } 是undefined,为什么呢,原因执行到第一行aaa虽然前面没有声明aaa函数,但是js解释器会向后面找aaa函数声明,结果找到了,但是var www第二行的代码还没执行,所以this.www也就是window.www还没有执行,虽然函数可以先调用后声明,变量绝对不可以 var www=123; aaa(); function(){ alert(this.www); } 这样就可以了 再有ie的dom实现问题 以前看到过一个context问题,就是说ie下面$=document.getElementById这样简化dom方法,但是ff不可以,我当时就认为是ff丢失了context,所以$.call(document,"...")就可以了,确实,但是ie下这样又不可以了,为什么呢,我alert($.call)在ff下有native code出现,可以ie下是undefined,再写了 javascript:alert(typeof document.getElementById)ie下面是object而ff下面是function,ie的实现确实不知道怎么弄的 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2007-09-22
c++和js差的太远了,就好像拿蜥蜴和猴子比,有点搞笑了。
关于function声明,解释器并不是往后面找,而是会把函数声明提前处理。 关于DOM,因为它不是JS的native对象,它只要确保实现DOM规范的接口。所以IE怎么做都不能说是完全不对,尽管我也更喜欢FF的方式。 |
|
| 返回顶楼 | |
|
时间:2007-09-22
没有可比性,应用场景相差太大,如果只比语法,那么本来大多数语言语法都是c风格发展而来,可以这样与c++类比的太多了....
|
|
| 返回顶楼 | |
|
时间:2007-09-24
lz的众多对比,似乎都忽略了实质 1、不是说c++不用写function,js要写function,js中,function是个类,而function name,可以假想成function是类型,而name是变量。用var name=function() {},或者var name=new Function();就可以明白。而c++里没有function类这个概念。 2、和5是同一个实质,下面一起讲 3、javascript是客户端脚本,操作本地内存不安全,当然没有sizeof这种东西…… 4、js当中有流的概念吗? 5、正如上面hax回的,js的解释器把所有变量定义都放到scope的最开始,所以不是说if(1){var a=123}alert(a)不出错,是因为这里面的{}没有scope(表面上确实没scope),但实质是变量已经都在函数的scope开始声明了,所以使用不会出错。而你所说到的第二点,因为函数声明也是声明,同样会被提到global scope的最开始,所以使用也不会出错。
另外,虽然楼主的学习精神不错,但是用js和c++比较确实有点让人摸不着头脑,如果说有些人一开始会把js和java搞混,然后来个比较还说的过去。 |
|
| 返回顶楼 | |
|
时间:2007-09-24
第一点function a(){}和var a=function(){}或者var a=new Function()绝对不一样,如果是
aaa(); var aaa=function(){alert(123)} 所以function声明肯定是js解释器特殊的预处理标志 第4点,其实就是"a,b,c,d,e,f".split(",").splice(1).join("-")这样的连续操作 第五点,不是很明白你说的,我想表达的是,在c++当中,只要有{}就是scope但是js里面只有function这个scope,所以if(1){var a=1}这句,如果不在function里面执行,其实就是给window增加了个变量a,后面当然就能显示出来了,看你的意思好象是说所有的var都是最优先的,先执行的,不管var是不是在后面,不是那样的,var也是按顺序执行的,只有function这个声明是例外,并且var a=function(){}和var a=new Function这两个也必须按顺序,var没有优先级,function的优先执行真是很不可思议 只是最近有机会再接触c++,所以对比了下 |
|
| 返回顶楼 | |
|
时间:2007-09-25
To Ajaxgo:
没有sizeof不是安全啊之类的原因。而是因为js没有必要有sizeof。java实际上也没有sizeof。c有sizeof是因为c可以操作内存,并且其类型是跟着机器的,同样的类型在不同机器上编译出来,可能size不同。而java,js这样的语言,对于所有类型的size都是规定的。 关于流,这跟js没有关系。host提供什么,js就有什么。所以用上ActiveX,就有流了。另一个例子是rhino,当然可以调用java中的stream相关类。 |
|
| 返回顶楼 | |
|
时间:2007-09-25
关于var的scope问题,其实这是js的一个设计失误。js2加入了let来解决(其实现在的FF2已经支持了,不用等到FF3)。
|
|
| 返回顶楼 | |
|
时间:2007-09-25
感觉拿这两者来比较有点。。。。。。哎,路过
|
|
| 返回顶楼 | |
|
时间:2007-09-25
var的行为确实比较奇怪吧.let实现的scope内部声明和window就是没什么关系了,但是在全局上,和var还是一样的,见最后的变量y
if(true) { let x=123; alert(x)//123 alert(window.x)//undefined } alert(x)//undefined alert(window.x)//undefined if(true) { var x=123; alert(x)//123 alert(window.x)//123 } alert(x)//123 alert(window.x)//123 let y=1230; alert(window.y)//1230 |
|
| 返回顶楼 | |







