给定代码的JavaScript执行序列无法理解

时间:2019-01-30 07:37:44

标签: javascript

我在控制台中运行了以下代码:

    let a3 = 100;
    setTimeout( function(){
            a3 = a3 + 1;
            console.log(a3);
        }, 4000);

     console.log( ++a3+'st'); 

我不了解上述JavaScript代码的执行顺序。

我希望输出为

EXPECTED OUTPUT

101st     //since console.log(++a3+'st') executes first
101st1   //the setTimeout() function executes

但是我得到的实际输出是

ACTUAL OUTPUT

101st
102    

我想理解的是,如果a3运行后"101st"变成字符串console.log( ++a3+'st');,那么为什么setTimeout()内的代码如此

setTimeout( function(){
        a3 = a3 + 1;
        console.log(a3);
    }, 4000);

稍后运行,将a3设置为102,而不是101st1,因为"101st" + 1 = "101st1"呢?

3 个答案:

答案 0 :(得分:1)

  

如果from mimetypes import guess_type from os.path import basename f = model.filefield f.open() # msg.attach(filename, content, mimetype) msg.attach(basename(f.name), f.read(), guess_type(f.name)[0]) f.close() 运行后a3成为字符串“ 101st”

不是。该语句对console.log( ++a3+'st');所做的全部工作就是通过a3部分将其加1 。然后将其与++a3串联在一起,得到一个st格的字符串,但不保存在任何地方-console.log仍然是递增的数字。

要使a3成为字符串,您必须将结果显式分配给a3

a3

(但是请不要那样做-不应将赋值解析为表达式,这是一种代码味道)

答案 1 :(得分:0)

让我们分解代码

以下是同步代码,将立即执行,因此在控制台中写入(++100+'st') => (101+'st') => 101st

 let a3 = 100;
 ...
 console.log( ++a3+'st'); 

setTimeout是一个异步代码块,将在执行同步代码后执行,因为a3现在是101a3+1将输出{{1 }}

102

因此您将获得输出

setTimeout( function(){
  a3 = a3 + 1;
  console.log(a3);
}, 4000);

答案 2 :(得分:0)

实际上没问题。调用此console.log( ++a3+'st');时,它只会增加到101,而不会101st使用此

let a3 = 100;
    setTimeout( function(){
            a3 = a3 + 1;
            console.log(a3);
        }, 4000);
a3 = (a3 + 1) + 'st'
console.log(a3);