>  기사  >  웹 프론트엔드  >  C와 자바스크립트의 차이점은 무엇인가요?

C와 자바스크립트의 차이점은 무엇인가요?

醉折花枝作酒筹
醉折花枝作酒筹원래의
2021-06-16 10:21:014070검색

차이점은 다음과 같습니다. 1. C 언어는 기계어로 컴파일되는 반면, JS는 인터프리터에 의해 스크립트로 해석되고 실행됩니다. 2. C 언어에서는 프로그래머가 메모리를 수동으로 관리해야 하지만 JS 메모리는 인터프리터에 의해 관리됩니다. .C 언어는 시스템 API를 호출하여 멀티스레딩을 구현하는 반면 JS는 단일 스레드입니다.

C와 자바스크립트의 차이점은 무엇인가요?

이 튜토리얼의 운영 환경: Windows 7 시스템, JavaScript 버전 1.8.5, Dell G3 컴퓨터.

1. C 언어는 주로 기계어로 컴파일되는 반면, JavaScript는 주로 인터프리터에 의해 스크립트로 해석되고 실행됩니다.

2. C 언어는 프로그래머가 수동으로 메모리를 관리해야 합니다(주로 힙 메모리의 적용 및 해제를 참조). ), JavaScript의 메모리는 인터프리터에 의해 관리됩니다.

3. JavaScript는 동적 유형의 언어이며 런타임 중에 변수의 데이터 유형이 변경될 수 있습니다.

4. 클로저가 정의될 ​​때 액세스됩니다.

5. "클래스 상속 및 다형성"과 같은 객체 지향 기능을 지원하며 JavaScript는 프로토타입 체인 및 클로저를 통해 객체 지향 상속, 다형성 및 캡슐화를 달성하고 ECMAScript 2015 이상을 구현할 수 있습니다. . JavaScript는 문법 수준에서 클래스 정의를 지원합니다.

6. C 언어는 시스템 API를 호출하여 멀티스레딩을 실현할 수 있으며, 차단 작업(주로 IO) 중에 CPU 활용률을 향상시킬 수 있습니다. 주로 단일 스레드이며 JavaScript의 가능한 모든 차단 작업은 JavaScript 런타임에서 제공하는 비동기 API에 의해 완료됩니다. C 기초를 가진 학생들의 경우 js 학습은 매우 간단하며 여기에는 주로 유사한 구문이 나열되어 있습니다. 둘 사이의 유사점과 차이점, 기본적으로 이러한 유사점과 차이점을 기억하면 js를 사용할 수 있습니다. 단 며칠 또는 단 하루만 공부하면 js를 사용하여 Baidu 지도를 호출하고 QT에서 3차원 모델 및 기타 재미있는 기능을 그릴 수 있습니다.

QT 개발 과정에서 qss, qml, js가 자주 사용되는데 이는 프론트엔드 3종 세트(CSS/HTML/JS)와 매우 유사합니다. JS의 공통 구문에 대한 기록입니다.

C 언어의 함수 포인터 개념은 JS에도 적용됩니다. 그러나 JS의 함수 포인터는 컴파일 수준이 아니라 해석 수준에 있습니다. 그러나 사용법은 동일합니다.

0. [변수 선언] C 언어에서는 변수를 먼저 선언한 후 사용해야 하지만, JS에서는 선언 없이 바로 사용할 수도 있고, 먼저 사용한 후 선언하는 것도 지원합니다.

1. [할당 및 참조 할당] JS에서 변수에 값을 할당할 때 기본 유형이 복사 할당인 것을 제외하면 "others"는 모두 참조 할당입니다(소위 "others"는 실제로 객체 변수입니다). JS). 참조 할당을 명시적으로 지정하지 않는 한 C 언어의 할당은 복사 할당입니다.

2. [콜백] 둘 다 콜백 함수의 개념을 갖고 있으며 함수명은 콜백 변수명입니다.

3. [자체 호출]. JS는 함수를 정의할 때 즉시 호출할 수 있습니다. 구문은 다음과 같습니다.

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

는 전체 함수를 정의하고 이를 괄호 A로 묶은 다음(함수의 함수 포인터를 가져오는 것과 동일) 괄호 B를 추가합니다(이 함수를 실행하는 것과 동일). 괄호 B는 매개변수를 채울 수 있습니다. 그리고 여기서 함수명은 생략 가능합니다.

4. [함수 안에 함수 정의하기] JS에서는 함수 안에 함수를 정의할 수 있습니다.

5. [마감]

이 개념은 비교적 새로운 것이며 C/C++에서는 본 적이 없습니다. JS 튜토리얼을 읽으면서 이 개념이 매우 간단하다는 것을 알았습니다. 간단히 말해서, 이는 함수가 지역 정적 변수를 가질 수 있도록 하는 프로그래밍 기술입니다.

일반적으로 JS의 변수 범위는 C와 일치합니다. 형식 매개변수나 함수의 반환 값을 사용하여 지역 변수의 포인터를 변경하지 않는 한 함수 내의 변수는 함수 외부에서 액세스할 수 없습니다. 함수 외부의 코드가 포인터를 통해 함수 내부의 지역 정적 변수를 작동할 수 있도록 합니다. 마찬가지로 이 기술은 JS에도 존재하며 이름은 클로저입니다. 차이점은 C가 함수에서 던지는 것은 지역 정적 변수에 대한 포인터인 반면, JS가 던지는 것은 이 지역 변수를 작동할 수 있는 함수에 대한 포인터라는 것입니다.

비교를 위해 다음은 "closure"의 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와 함수 B가 함수 A에 정의되어 있습니다. 분명히 B는 a에 액세스할 수 있습니다. A 외부의 코드가 a에 액세스하도록 하려면 어떻게 해야 할까요? 생각하는 방법에는 두 가지가 있습니다. 하나는 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와 자바스크립트의 차이점은 무엇인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.