首页 web前端 js教程 c和javascript区别有哪些

c和javascript区别有哪些

Jun 16, 2021 am 10:21 AM
c语言 javascript

区别有:1、C语言是被编译成机器语言,而JS是作为脚本被解释器解释执行;2、C语言需要程序员手动管理内存,而JS的内存是由解释器来管理的;3、C语言通过调用系统API来实现多线程,而JS是单线程。

c和javascript区别有哪些

本教程操作环境:windows7系统、javascript1.8.5版、Dell G3电脑。

1、C语言主要是被编译成机器语言,而JavaScript主要是作为脚本被解释器解释执行;

2、C语言需要程序员手动管理内存(主要指堆内存的申请和释放),而JavaScript的内存是由解释器来管理的;

3、JavaScript是动态类型语言,变量的数据类型在运行时仍可变化;

4、JavaScript中的函数都与其定义时可访问到的变量组成闭包;

5、“类的继承与多态”等面向对象的特性的支持,而JavaScript可以通过原型链和闭包等实现面向对象的继承、多态和封装,实现ECMAScript 2015及以上版本的JavaScript更是在语法层面支持类的定义;

6、C语言可以通过调用系统API来实现多线程,可以通过多线程来提高阻塞操作(主要是IO)时的CPU利用率,而JavaScript主要是单线程,JavaScript的可能阻塞的操作都由JavaScript运行时提供的异步API来完成

对于有C基础的同学来说,学js是相当简单的,语法类似,这里主要列一下两者的异同,基本上记住了这些异同点,就可以上手使用js了。只需几天,甚至一天的学习,就可以用js在QT调用百度地图,绘制三维模型等好玩的功能。

QT开发过程中,经常要用到qss、qml、js,跟前端三件套很像(CSS/HTML/JS),这里记录一下JS的常见语法。

C语言中的函数指针的概念,在JS中也是适用的,只不过JS中的函数指针并不是编译级的,而是解释级的,在底层实现上有所不同,但用法相同。

0、【变量声明】在C语言中的变量必须先声明,后使用;而JS允许不声明直接用,当然也支持先声明后使用,先使用后声明。

1、【赋值与赋引用】js中的变量赋值时,除了基本类型是拷贝赋值以外,"其他"都是赋引用(所谓"其他",其实都是JS中的对象变量)。C语言的赋值,都是拷贝赋值,除非你显式地指定要赋引用。

2、【回调】两者都有回调函数的概念,而且函数名就是回调变量名,C和JS都是如此。

3、【自调用】。JS可以在定义函数的时候,立即调用一次。语法为:

无参函数示例
(function fooA (){
            //这里是函数体
        })();
有参函数示例:
(function fooB(var a){
            //这里是函数体
        })(5);
登录后复制

就是把整个函数定义,用小括号A括住(这就相当于拿到了该函数的函数指针),然后后面再加一个括号B(这就相当于执行这个函数),后面的小括号B,可以填参数。而且这里的函数名可省略不写。

4、【函数内定义函数】JS允许在函数内部继续定义函数。

5、【闭包】

这个概念比较新鲜,在C/C 中没见过,通过阅读JS教程发现这东西也简单的很,就是起的名字太唬人了,简单来讲,这种编程手法,可以使某个函数拥有局部静态变量。

一般来说,JS中变量的作用域,与C是一致的,函数内的变量,在函数外是无法访问的,除非你用函数的形参或者返回值,把局部变量的指针,弄到外面,这样函数外面的代码就可以通过指针操作某个函数内部局部静态变量了。与此类似,JS中也有这种手法,这种手法的名字叫闭包。区别在于,C从函数中扔出的是某个局部静态变量的指针,而JS扔出的是能够操作这个局部变量的的函数的指针。

为了对比,先来一个C语言版本的“闭包”:

uint8_t *getBuf(void)
{
    static uint8_t buf[1024];
    return buf;
}

void sendCmd()
{
    uint8_t *cmdBuf = getBuf(void);
    cmdBuf[0] = 0xA5;
    cmdBuf[1] = 0xFF;
    ....
    send(cmdBuf, 10);
}
登录后复制

getBuf函数中有一个局部静态数组buf,本来程序的其他代码是无法访问到它的,但是我们通过该函数的返回值,将其首地址送出来,就实现了外部代码对该数组的访问。例如sendCmd函数就使用了一下这个数组。

下面是JS版本:

场景(1):函数A内定义了变量a和函数B,显然B是可以访问a的,如何才能让A外面的代码访问到a呢?有2种思路,一种是返回a的引用,另一种是闭包。返回引用就不说了,因为a在A执行完后内存会被释放,返回a的引用也无法访问a。

var aRef = (function A(){
            var a = 2;
            return function B(){
                return a++;
            }
            })();

alert(aRef());
alert(aRef());
登录后复制

上述代码的效果为,弹出提示框,内容为数字2, 然后再次弹出提示框,内容为数字3。其中函数名A和函数名B均可不写。

我们来分析一下上述代码,首先函数A是个自调用函数(也可以不自调用,后面有例子),所以A里面变量a立即被赋值为2,函数A的返回值为函数B的函数指针,所以变量aRef就是个函数指针,以后调用aRef( ),就相当于调用了函数B( )。而B( )的返回值为a++。按照JS的设计机制,这种情形下的变量a将会常驻内存,这就是实现了让函数A拥有局部静态变量,而这个局部静态变量,只能被A返回的函数指针(也即函数B)修改。

基于上述分析,我们可以把上述代码改成这样,更容易阅读:

var aRef = (function A(){
            var a = 2;            
            function B(){
                return a++;
            }
            return B;
            })();

也可以改成这样:
function A(){
    var a = 2;            
    function B(){
        return a++;
    }
    return B;
}
var aRef = A();//A没有进行自调用,只能在这里调一次,才能获取到B的函数指针
登录后复制

情形2:经典的JS定时器闭包。题目:使用for循环,每秒打印出for当前的值。

错误写法:

for(var i = 1; i <= 5; i++)
{
    setTimeout(function(){
        alert(i);
    }, 1000);
}
登录后复制

执行的效果是,连续弹出5次数字5,而不是预想的依次弹出12345。原因是,第一次执行定时器的回调函数前,i的值就已经变成5了,后续4次定时回调,i的值也是5.

正确写法:

for(var i = 1; i <= 5; i++)
{
    (function(a){
        setTimeout(function(){alert(a);}, 1000);
    })(i);
}
登录后复制

这里使用了一个匿名的自调用函数(为了叙述方便,我下面称之为out函数),在函数内部又声明了匿名的定时器回调函数(为了叙述方便,我下面称之为in函数),因此使得in函数成了闭包函数,从而使得out函数的局部变量a常驻内存了。

为了更清楚de看明白它的原理,我们再把这段代码改成这样,增强可读性:

function outFunc(a){
    function inFunc(){
        alert(a);
    }
    setTimeout(inFunc, 1000);
}

for(i = 0; i < 4; i++)
{
    outFunc(i);
}
登录后复制

这段代码看起来清晰了,可以一目了然地看出其中的闭包语法。

总结一下闭包就是:一旦执行了闭包函数所在的外部函数,那么这个外部函数所维护的局部变量,将会常驻内存。

最后来一个实例应用,看看闭包在实际场景中是如何应用的。题目:有如下C语言函数,请把它改成js版。

uint32_t readVol(void)
{
    static uint8_t callCnt = 0;
    callCnt++;
    return callCnt;
}
登录后复制

这个C函数的功能很简单,就是每次调用时,会返回该函数被调的次数,也即readVol这个函数拥有自己的局部静态变量。用js实现如下:

    var readVol = (function ()
	{
		var callCnt = 0;
		return function()
		{
			callCnt++;
			return callCnt;
		}		
	})();
登录后复制

这个readVol函数与C语言的readVol函数功能完全一致。

【推荐学习:javascript高级教程

以上是c和javascript区别有哪些的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

c语言中typedef struct的用法 c语言中typedef struct的用法 May 09, 2024 am 10:15 AM

typedef struct 在 C 语言中用于创建结构体类型别名,简化结构体使用。它通过指定结构体别名将一个新的数据类型作为现有结构体的别名。优点包括增强可读性、代码重用和类型检查。注意:在使用别名前必须定义结构体,别名在程序中必须唯一并且仅在其声明的作用域内有效。

c语言中strcpy和strcat的区别 c语言中strcpy和strcat的区别 May 08, 2024 pm 01:03 PM

strcpy复制字符串到另一个字符串,而strcat将字符串附加到另一个字符串之后。主要区别包括:目的不同、dst参数处理不同、安全性考虑不同。

c语言中real是什么意思 c语言中real是什么意思 May 09, 2024 pm 12:06 PM

real 是 C 语言中用于表示双精度浮点数的数据类型,占用 8 个字节,精度约为 15 位小数位,范围为 [-1.7976931348623157e+308, 1.7976931348623157e+308]。

_complex在c语言中的用法 _complex在c语言中的用法 May 08, 2024 pm 01:27 PM

complex 类型用于表示 C 语言中的复数,包含实部和虚部。其初始化形式为 complex_number = 3.14 + 2.71i,实部可通过 creal(complex_number) 访问,虚部可通过 cimag(complex_number) 访问。该类型支持常用的数学运算,如加、减、乘、除和取模。此外,还提供了一组用于处理复数的函数,如 cpow、csqrt、cexp 和 csin。

C语言乘方函数如何实现 C语言乘方函数如何实现 May 09, 2024 pm 11:33 PM

C语言中,实现乘方运算有两种方法:使用pow()函数,计算第一个参数的第二个参数次方。定义自定义乘方函数,可通过递归或迭代实现:递归方式持续将幂次减少一倍,直至为0。迭代方式使用循环逐次累乘基数。

c语言中scanf出现错误怎么办 c语言中scanf出现错误怎么办 May 09, 2024 am 11:39 AM

在 C 语言中,处理 scanf 函数错误的方法包括:1. 检查格式字符串;2. 检查输入;3. 检查返回值;4. 设置错误标志;5. 使用错误处理函数;6. 使用自定义错误处理。为了防止错误,请使用正确的数据类型、仔细验证输入、检查返回值以及在程序中处理潜在错误。

restrict在c语言中的用法 restrict在c语言中的用法 May 08, 2024 pm 01:30 PM

restrict 关键字用于通知编译器变量只能由一个指针访问,防止未定义行为、优化代码并提高可读性:防止未定义行为,当多个指针指向同一变量时。优化代码,编译器利用 restrict 关键字优化变量访问方式。提高代码可读性,表明变量只能由一个指针访问。

_bool在c语言中是什么意思 _bool在c语言中是什么意思 May 08, 2024 pm 01:33 PM

_Bool 在 C 语言中代表布尔型,它是一种仅包含 true 或 false 两个值的简单数据类型,用于表示条件或逻辑表达式的结果,通常占 1 字节内存,并仅能存储 true 或 false 值。

See all articles