2016-12-19 2 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 к -210" каждый раз, когда проходит интервал, так что "если (lThis == NULL)", кажется, не будет ничего не делать

См. example on codepen

+0

l Это имя переменной, локальное для функции добавления, и будет инициализироваться и/или повторно объявляться каждый раз при вызове функции. Чтобы избежать осложнений, вы также можете объявить lThis глобально. - И вы никогда не сравниваете литералы с нулевым значением, если только вы не аннулировали его дескриптор вручную и преднамеренно позже в коде, чтобы сбросить его значение. Даже тогда, сбрасывая переменную, которая должна нести буквальное значение, неверна. –

ответ

1

С setInterval функции надстройки выполняется каждые 33ms с самого начала, сделать всю область видимости функции воссозданы, включая lThis. Я предполагаю, что вы хотите добавить 1 на каждый вызов lThis внутри функции. Одним из способов достижения этой цели использует закрытие следующего образом:

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); 

Примечания, это старый способ написания JavaScript, с новым ES6 синтаксиса может быть достигнута в гораздо более компактной форме:

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 - локальная переменная в вашем примере. Таким образом, lThis будет повторно инициализирован до undefined каждый раз, когда вызывается функция add(), и вы никогда не достигнете lThis++. Вы, вероятно, хотите, чтобы двигаться lThis за пределами add():

var lThis; 

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

Ваших переменная lThisявляется локальной переменной, она существует (и создаются каждый раз) только в рамках function add(). Если вы хотите сохранить значение lThis во время setInterval(...) вы должны рассмотреть, чтобы переместить его в глобальную область видимости:

var lThis = null; 

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

lThis является локальной переменной. Эта переменная будет сброшена до «null» каждые 33 мс, когда вызывается add().

насчет другой глобальной переменной, например:

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) 

И ... не просто ребячество. Примеров больше нет.