JavaScript 程序的输出结果
在这篇文章中,我们会看到不同Javascript程序的输出结果。
预测并解释下面Javascript程序的输出结果。
示例1
当记录(x, y, z)时,x的值为4(因为基本类型通过值传递,所以即使在函数f()之后它的值也不会改变)。y是一个数组,因此是一个对象,所以它通过引用传递,它的索引0被修改为X。因此,y记录X,B,C。在函数f()内部,c.first被改变为false,并且由于是通过引用传递,它记录了first: false。在函数g()中,创建了一个新对象,它的值为true,因此它记录了first: true。最后,在最后一行中,z.first仍然等于false,因此它记录了first: false。
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);
输出:
4 ["X", "B", "C"] {first:false} {first:true} {first:false}
示例2
在foo1()中,bar对象作为应该返回,并因此给出输出{bar:”hello”}。 但是在foo2()中,return后的换行符被解释为不同。 它隐式地在return后加上了一个分号,并且相应的一组行被视为一组语句。 因此foo2()有以下的return语句- return;,它给出了undefined的输出。
<script type="text/javascript" charset="utf-8">
function foo1() {
return {
bar: "hello"
}
}
function foo2() {
return
{
bar: "hello";
}
}
console.log(foo1());
console.log(foo2());
</script>
输出:
{bar:"hello"}
undefined
示例3
setTimeout()函数只有在父函数完全执行并返回之后才会被调用。所以即使console.log(3)设置了0毫秒的超时时间,它也只会在父函数返回后执行,即在打印1和4之后。然后打印3。最后,在1000毫秒的超时之后,打印2。
(function() {
console.log(1);
setTimeout(function(){console.log(2)}, 1000);
setTimeout(function(){console.log(3)}, 0);
console.log(4);
})();
输出:
1
4
3
2
示例4
使用立即调用函数表达式(IIFE)的帮助,它将创建自己的作用域,我们可以将i传递给函数。变量i将成为局部变量,并且在每次循环中,i的值将被保留并在1秒后打印出来。
for (var i = 0; i < 5; i++) {
(function(x) {
setTimeout(function() {
console.log(x);
}, 1000 );
})(i);
}
输出:
0
1
2
3
4
示例5
在check()函数内对变量x进行定义和初始化后进行输出。变量的声明可以被提升,但是初始化不能,所以返回undefined。在check()函数内,变量y被初始化为10。由于没有使用var关键字,该变量的作用域会一直持续到遇到同名变量或者全局对象。所以当调用check2()函数时,输出的结果是10。
var x= 5;
function check(){
y = 10;
console.log(x);
var x =10;
}
function check2(){
console.log(y);
}
check();
check2();
输出:
undefined
10
极客教程