2016-12-19 6 views
1

変数が設定されていない場合にのみ、最初に変数を設定しようとしています。何らかの理由で、変数が設定されているかどうかを判断するために使用しているロジックは、変数が設定されているかどうかにかかわらず実行されているようです。変数が設定されているかどうかをチェックすることはできません

私のコードは

var l0 = -210; 

function add(){ 
    var lThis; 
    if (lThis == null){ 
    lThis = l0; 
    console.log('set lThis to '+ lThis); 
    } 
    lThis ++; 
} 

var incrementInterval = setInterval(add, 33); 

間隔が実行されるたびに、そう "(lThis == nullの)場合は、" 何も

をやっていないしているようだ "-210にlThis設定" コンソールログですexample on codepen

+0

lこれは、add関数のローカル変数であり、関数が呼び出されるたびに初期化または再宣言されます。合併症を避けるために、lThisをグローバルに宣言することもできます。 - そして、値をリセットするために手作業で意図的にコードを無効にしない限り、リテラルをnullに比較することはありません。それでも、リテラル値を持つと思われる変数を無効にするのは間違っています。 –

答えて

1

は、最初からすべての33msを実行している全機能の範囲はlThis含めて、再作成されます。あなたが達成したいのは、関数内のすべての呼び出しに1を加えることです。それを達成する方法の1つは、次のようにクロージャを使用している:

var l0 = -210; 

function thunkAdd(){ 
    var lThis = l0; 
    console.log('set lThis to '+ lThis); 
    return function inc() { 
    console.log(lThis); 
    return lThis ++; 
    } 
} 

var incrementInterval = setInterval(thunkAdd(), 33); 

注意、これは新しいES6の構文で、それははるかにコンパクトな形で達成することができ、JavaScriptを書くの古いやり方です:

const l0=-210; 

function *add() { 
    let lThis = l0; 
    while (true) yield lThis++; 
} 

const lAdd = add() 
const incrementInterval = setInterval(() => {console.log(lAdd.next())}, 33); 
何が価値があるために
+0

これは、変数のインクリメントに非常に役立ちました。私はhttp://stackoverflow.com/q/41232326/370407に投稿したフォローアップを持っています。多分あなたはそこにいくつかの洞察力を持っています。 –

1

lThisは、例のローカル変数です。したがってadd()が呼び出されるたびにlThisundefinedに再初期化され、決してlThis++に届きません。あなたはおそらくadd()lThis外に移動したい:

var lThis; 

function add() { 
    if (!lThis) { 
    lThis = l0; 
    console.log('set lThis to '+ lThis); 
    } 
    lThis++; 
} 
1

をあなたの変数lThisはそれだけfunction add()の範囲内に存在する(とするたびに作成)、ローカル変数です。あなたがグローバルスコープに移動するために検討すべきであるsetInterval(...)中にlThisの値を保持したい場合は :

var lThis = null; 

function add() { 
    if (lThis == null) { 
     lThis = -210 
     console.log('set lThis to '+ lThis); 
    } 
    lThis++; 
} 
1

lThisローカル変数です。 add()が呼び出されると、この変数は33msごとに 'null'にリセットされます。

このような別のグローバル変数、何について:のsetInterval関数の追加で

var l0 = -210; 
var lThis; 

function add() { 
    if (lThis == null) { 
    lThis = l0; 
    ....... 
0

は、私はあなたの全体のコードスニペットは、劇的な書き換えを必要だと思い

function add (x) { 
 
    console.log(x) 
 
    setTimeout(add, 33, x + 1) 
 
} 
 

 
let timeout = add(-210)

あなたは本当にいくつかの(おそらく悪い)理由

let x = -210 
 

 
function add() { 
 
    console.log(x) 
 
    x = x + 1 
 
} 
 

 
let timeout = setInterval(add, 33)

、別の

function delay (ms) { 
    return new Promise(r => setTimeout(r, ms)) 
} 

async function add (x) { 
    console.log(x) 
    await delay(33) 
    add(x + 1) 
} 

add(-210) 

そして...いいえは冗談のグローバル変数をしたい場合。これ以上の例はありません。

関連する問題