2017-12-03 13 views
1

私はjavascript関数は、関数ハンドルを戻す方法を理解しようとしていますと、なぜ次のコードを印刷「2」の代わりに「1」「関数としてリターン」はjavascript関数は

var num = 01; 
 
function processAndIncrement() { 
 
    var process = function() { 
 
    console.log(num); 
 
    } 
 
    num++; 
 
    return process; 
 
} 
 
var proCall = processAndIncrement(); 
 
proCall();

+1

はい、関数ハンドルを返します。これは、呼び出されると、 'num'の現在の値を出力します。特にあなたはそれについて理解していないのですが、どうしてそれが '1 'を記録すると期待していたのですか? – Bergi

+0

'processAndIncrement'の呼び出しは' num'(グローバル変数)をインクリメントし、 'num'(これは' 2'です)を記録する別の関数を返します。 –

答えて

0

の仕組みnum変数は、コード内の関数とは独立しています。どちらの関数も同じ変数を参照するため、同じデータを変更して変更を観察します。

したがって、num++の操作は、proCallが呼び出される前に、numをインクリメントします。 proCallが最後に呼び出されると、すでにインクリメントされているため、インクリメントされた状態はnumとなります。


ここでは、操作の順序について説明します(巻き上げを無視する)。一連の番号に従ってください。

// 1. create the variable 
var num = 01; 

// 2. create the processAndIncrement function 
function processAndIncrement() { 

    // 4. Assign a function that logs `num` to the `process` variable 
    var process = function() { 

    // 8. log the current value of `num` (which was incremented at step 5) 
    console.log(num); 
    } 

    // 5. increment `num` 
    num++; 

    // 6. return the `process` function 
    return process; 
} 

// 3. Invoke processAndIncrement, and assign its return value to `proCall` 
var proCall = processAndIncrement(); 

// 7. invoke `proCall` (which is the same as the `process` function) 
proCall(); 

あなたはproCallが呼び出されたときに発生する増分を望んでいた場合は、num++process関数内であることを移動する必要があります。

1

numのインクリメントがすでに1(01 == 1)であるため、コードで2が印刷されます。

関連する問題