我只是在没有设置变量时才尝试设置变量。出于某种原因,无论是否已设置变量,我用来确定变量是否已设置的逻辑似乎都会运行。
我的代码是
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)"似乎无所事事
答案 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)
对于它的价值,我认为你的整个代码片段需要一个戏剧性的重写
function add (x) {
console.log(x)
setTimeout(add, 33, x + 1)
}
let timeout = add(-210)
&#13;
如果你真的想要某个(可能是坏的)原因的全局变量
let x = -210
function add () {
console.log(x)
x = x + 1
}
let timeout = setInterval(add, 33)
&#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)
而且......不只是在开玩笑。没有其他例子了。