检查是否已设置变量不起作用

时间:2016-12-19 21:51:47

标签: javascript if-statement initialization undefined

我只是在没有设置变量时才尝试设置变量。出于某种原因,无论是否已设置变量,我用来确定变量是否已设置的逻辑似乎都会运行。

我的代码是

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"每次间隔运行,所以" if(lThis == null)"似乎无所事事

请参阅example on codepen

5 个答案:

答案 0 :(得分:1)

lThis是您示例中的局部变量。因此,每次调用函数lThis时,undefined都会重新初始化为add(),您永远不会达到lThis++。您可能希望将lThis移到add()之外:

var lThis;

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

答案 1 :(得分:1)

您的变量lThis本地变量,它仅在function add()范围内存在(并且每次都创建)。 如果您想在lThis期间保留setInterval(...)的值,则应考虑将其移至全局范围:

var lThis = null;

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

答案 2 :(得分:1)

lThis是一个局部变量。 <{1}}被调用时,此变量将每33毫秒重置为“空”。

另一个全局变量如下:

add()

答案 3 :(得分:1)

使用setInterval函数add从一开始就每隔33ms执行一次,重新创建整个函数范围,包括lThis。我想你想要实现的是在函数中每次调用lshis时加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);

请注意,这是编写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);

答案 4 :(得分:0)

对于它的价值,我认为你的整个代码片段需要一个戏剧性的重写

&#13;
&#13;
function add (x) {
  console.log(x)
  setTimeout(add, 33, x + 1)
}

let timeout = add(-210)
&#13;
&#13;
&#13;

如果你真的想要某个(可能是坏的)原因的全局变量

&#13;
&#13;
let x = -210

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

let timeout = setInterval(add, 33)
&#13;
&#13;
&#13;

另一个

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)

而且......不只是在开玩笑。没有其他例子了。