我刚刚检查了javascript函数的行为 而且我还想知道每个人都要检查一下,并告诉我这两个javascript函数行为之间的区别
示例代码如下
document.write("Hello");
var one = foo1();
var two = foo2();
document.writeln(two);
document.writeln(one);
function foo2 (){
return
{
bar:"hello"
};
}
function foo1 (){
return {
bar:"hello"
};
}
输出是
您好未定义的[object Object]
我只想知道如何??
答案 0 :(得分:1)
以下内容无法按预期工作:
function foo2 (){
return
{
bar:"hello"
};
}
执行return语句,然后{ bar:"hello" };
只是一个代码块;一个不可达的,因为它在返回语句被求值之后立即出现。
要解决此问题,请确保return语句与对象的大括号位于同一行:
function foo2 (){
return {
bar:"hello"
};
}
现在是打印部件-document.writeln()
接受其参数上的调用.toString()
,对于对象来说,意味着打印[object object]
。
在打印对象之前对它们运行JSON.stringify()
,如下所示:
function toJSON(arg) {
return JSON.stringify(arg, null, 2)
}
document.writeln(toJSON(two));
document.writeln(toJSON(one));
JSON.stringify(arg, null, 2)
而不是JSON.stringify(arg)
,因为2
参数指示间距,从而使其打印精美且更易理解。答案 1 :(得分:0)
JavaScript规范描述了称为自动分号插入的功能。进一步了解此here
document.write("Hello");
var one = foo1();
var two = foo2();
document.writeln(JSON.stringify(one));
document.write(JSON.stringify(two));
function foo2 (){
return {
bar:"hello"
};
}
function foo1 (){
return {
bar:"hello"
};
}
答案 2 :(得分:0)
在javascript中,您不需要;
结束一行代码,因此foo2()
在到达return语句时不返回任何值(未定义),这就是为什么您看到undefined并解析其余部分的原因就像一段代码,但永远不会到达。第二个函数执行您期望的操作并返回对象。如果您写document.writeln(one.bar);
,则应该看到Hello
。
答案 3 :(得分:0)
body
语句中的return
必须保持在同一行。
您会在undefined
中得到foo1()
,因为您什么也没有返回,这是因为ASI。
return // this returns undefined
{
"foo": "bar"
}
答案 4 :(得分:0)
啊!这是Javascript问题之一(或技巧?)
您可能会注意到,不必总是在指令末尾插入最后的分号。 例如,
let x = '3'
与 令x ='3'; 实际上,浏览器将始终像第二行一样读取它。这是由于ASI(自动分号插入)试图以一种智能的方式插入分号。
但是问题是我们看不到ASI的真正作用,因此很难调试。
第一个函数的转换方法如下:
function foo1 (){
return {
bar:"hello"
};
}
这是第二个函数的转换方式:
function foo2 (){
return ;
{
bar:"hello"
};
}
(请注意return
之后的“;”)
这就是为什么识别比您想象的重要得多的原因!
您可能想对ASI感兴趣: