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 作为输出。