ホームページ  >  記事  >  ウェブフロントエンド  >  CとJavaScriptの違いは何ですか?

CとJavaScriptの違いは何ですか?

醉折花枝作酒筹
醉折花枝作酒筹オリジナル
2021-06-16 10:21:014068ブラウズ

違いは次のとおりです: 1. C 言語は機械語にコンパイルされるのに対し、JS はインタプリタによってスクリプトとして解釈および実行されます; 2. C 言語ではプログラマが手動でメモリを管理する必要がありますが、JS メモリはインタプリタ. 管理する; 3. C言語はシステムAPIを呼び出すことでマルチスレッドを実現しますが、JSはシングルスレッドです。

CとJavaScriptの違いは何ですか?

このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。

1. C 言語は主に機械語にコンパイルされますが、JavaScript は主にインタプリタによって解釈されスクリプトとして実行されます;

2. C 言語ではプログラマーが手動でメモリを管理する必要があります (主にJavaScript のメモリはインタプリタによって管理されますが、JavaScript のメモリはインタプリタによって管理されます;

3. JavaScript は動的に型付けされた言語であり、変数のデータ型は実行時に変更される可能性があります;

4. JavaScript の関数は、定義時にアクセスできる変数を持つクロージャを形成します;

5. 「クラス継承とポリモーフィズム」などのオブジェクト指向機能のサポート、および JavaScript はプロトタイプ チェーンとクロージャを使用できます。オブジェクト指向の継承、ポリモーフィズム、カプセル化などを実装 ECMAScript 2015 以降を実装する JavaScript は文法レベルでのクラス定義をサポート;

6. C 言語はシステム API を呼び出すことで複数の機能を実現できます。 JavaScript は主にシングルスレッドであるのに対し、JavaScript はマルチスレッドによってブロック操作 (主に IO) 中の CPU 使用率を改善できます。JavaScript の可能なブロック操作は、JavaScript ランタイムによって提供される非同期 API によって完了します

学生向けC の基礎があれば、js の学習は非常に簡単で、構文も似ています。ここでは主に 2 つの類似点と相違点をリストします。基本的に、これらの類似点と相違点を覚えていれば、js を使い始めることができます。わずか数日、あるいは 1 日の学習で、js を使用して Baidu マップを呼び出し、3 次元モデルやその他の楽しい機能を QT で描画できるようになります。

QT の開発プロセスでは、フロントエンドの 3 点セット (CSS/HTML/JS) とよく似た qss、qml、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 はこのローカル変数を操作できる関数へのポインターをスローすることです。

比較のために、「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 で変数 a と関数 B が定義されています。明らかに B は a にアクセスできます。A の外部のコードにアクセスさせるにはどうすればよいですか。それは? はどうですか?アイデアは 2 つあり、1 つは a への参照を返すというもので、もう 1 つはクロージャです。参照を返すことについては説明しません。なぜなら、 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。