📜  JavaScript 程序的输出

📅  最后修改于: 2022-05-13 01:56:52.736000             🧑  作者: Mango

JavaScript 程序的输出

1. 预测并解释以下 JavaScript 程序的输出。

Javascript
function f(a, b, c) {
    m = ["1", "2", "3"];
    a = 3;
    b[0] = "X";
    c.first = false;
}
  
var x = 4;
var y = ["A", "B", "C"];
var z = { first: true };
  
f(x, y, z);
console.log(x, y, z);
  
function g(a) {
    a = { first: true };
    console.log(a);
}
  
g(z);
console.log(z);


Javascript
function foo1() {
   return {
      bar: "hello";
   };
}
  
function foo2() {
   return
   {
      bar: "hello";
   };
}
  
console.log(foo1());
console.log(foo2());


Javascript
(function() {
   console.log(1);
   setTimeout(function(){console.log(2)}, 1000);
   setTimeout(function(){console.log(3)}, 0);
   console.log(4);
})();


Javascript
for (var i = 0; i < 5; i++) {
   (function(x) {
      setTimeout(function() {
         console.log(x);
      },  1000 );
   })(i);
}


Javascript
var x= 5;
function check(){
   y = 10;
   console.log(x);
   var x =10;
}
  
function check2(){
   console.log(y);
}
  
check();
check2();


输出:

4 ["X", "B", "C"] {first:false} {first:true} {first:false}

解释:当 (x, y, z) 被记录时,x 给出值 4(因为原语是按值传递的,因此即使在函数f() 之后它的值也不会改变)。 y 是一个数组,因此是一个对象,因此它通过引用传递,并且它的索引 0 更改为 X。所以 y 记录 X、B、C。在函数f() 中,c.first 已更改为 false,并且由于它通过引用传递,它首先记录:false。在函数g() 中,创建了一个值为 true 的新对象,因此它首先记录:true。最后,在最后一行,z.first 仍然等于 false,因此它记录 first:false。

2. 预测并解释以下 JavaScript 程序的输出:

Javascript

function foo1() {
   return {
      bar: "hello";
   };
}
  
function foo2() {
   return
   {
      bar: "hello";
   };
}
  
console.log(foo1());
console.log(foo2());

输出: {bar:”hello”} 未定义

解释:在 foo1() 中,bar 对象按原样返回,因此它给出了输出 {bar:”hello”}。但是在 foo2() 中,return 后的换行符的解释不同。它在 return 后隐式放置一个分号,并且相应的行集被视为语句块。所以 foo2() 有如下的 return 语句——return;这给出了未定义的输出。

3. 预测并解释以下 JavaScript 程序的输出:

Javascript

(function() {
   console.log(1);
   setTimeout(function(){console.log(2)}, 1000);
   setTimeout(function(){console.log(3)}, 0);
   console.log(4);
})();

输出: 1432

说明: setTimeout()函数只有在父函数完全执行并返回后才被调用。因此,即使 console.log(3) 的超时时间为 0 毫秒,它也只有在记录 1 和 4 后父函数返回后才会执行。然后记录 3。最后在 1000 毫秒超时后,记录 2。

4. 预测并解释以下 JavaScript 代码片段的输出:

Javascript

for (var i = 0; i < 5; i++) {
   (function(x) {
      setTimeout(function() {
         console.log(x);
      },  1000 );
   })(i);
}

输出: 0 1 2 3 4

说明:在立即调用函数表达式(IIFE)的帮助下,它自己的作用域将被创建,我们可以将 i 传递给函数。变量 i 将是一个局部变量,每个循环中的 i 值将被保留并最终在 1 秒超时后打印。

5. 预测并解释以下 JavaScript 程序的输出:

Javascript

var x= 5;
function check(){
   y = 10;
   console.log(x);
   var x =10;
}
  
function check2(){
   console.log(y);
}
  
check();
check2();

输出:未定义 10

说明: var x 已在 check() 中定义并在其被记录后初始化。提升仅适用于变量声明,不适用于初始化,因此它返回未定义。在 check() 中,y 已被初始化为 10。由于未使用 var,因此该变量具有其范围,直到遇到给定名称的变量或全局对象。因此,当调用 check2() 时,它会记录 10 作为输出。