function list(type) {
var result = "<" + type + "l><li>";
var args = Array.prototype.slice.call(arguments, 1);
result += args.join("</li><li>");
result += "</li></" + type + "l>"; // end list
return result;
}
var listHTML = list("u", "One", "Two", "Three");
console.log(listHTML); // "<ul><li>One</li><li>Two</li><li>Three</li></ul>"
仔细查看打印出来的内容。
现在,这与我期望它的工作原理完全相反。
所以让我们把它分解,假设我调用如下的函数列表:
list("u", "One", "Two", "Three");
现在列表功能中发生了什么
var result = "<" + type + "l><li>"; // here type is still -- "u", "One", "Two", "Three" , than why does only u get inserted ??
var args = Array.prototype.slice.call(arguments, 1); // in understand this line
result += args.join("</li><li>");
result += "</li></" + type + "l>"; // end list
return result;
要让这个程序按照我的想法运作,至关重要的是只在第一行&#34; u&#34;插入而不是所有的参数(请参阅我的评论),但是如何在这个片段中完成,我知道这是一段简单的代码,但我真的坐在这里,抓着头看着这段代码。
有人可以解释一下吗?编辑我的预期输出是:
<uOneTwoThreel><li>One</li><li>Two</li><li>Three</li></uOneTwoThreel>
谢谢。
亚历-Z
答案 0 :(得分:5)
在Javascript中,伪数组 // ftl
public static TemplateHashModel useStaticPackage(String packageName)
{
try
{
BeansWrapper wrapper = BeansWrapper.getDefaultInstance();
TemplateHashModel staticModels = wrapper.getStaticModels();
TemplateHashModel fileStatics = (TemplateHashModel) staticModels.get(packageName);
return fileStatics;
}
catch (Exception e)
{
e.printStackTrace();
}
}
//
//data.put("list", list);
data.put("Helper",useStaticPackage("com.test.Helper"));
// ftl
${Helper.method()}
包含已传递给函数的所有,而函数参数列表中列出的命名参数则填充了传递的值,忽略了额外的参数如果没有通过足够的参数,则设置arguments
。
例如,使用undefined
调用function f(x, y){...}
将有
f(1,2,3,4)
= 1 x
= 2 y
= arguments
而是使用[1, 2, 3, 4]
致电function g(x, y){...}
将
g(1)
= 1 x
= y
undefined
= arguments
请注意,[1]
不是数组,因此您无法使用所有数组方法(如arguments
)。这就是join
技巧用于转换跳过数组中第一个参数的所有参数的原因。
答案 1 :(得分:2)
这里的问题是type
是一个参数,它将方法调用的第一个参数值保存为u
。由于你没有与传递的参数一样多的参数,其余的参数都没有正式的参考。
function list() {
//this will create an array params which will have all the values of the arguments object
var params = Array.prototype.slice.call(arguments, 0);
//we joins all the passes params to create the type
var type = params.join('');
var result = "<" + type + "l><li>";
//we ignores the first parameter here
var args = params.slice(1);
result += args.join("</li><li>");
result += "</li></" + type + "l>";
return result;
}
var listHTML = list("u", "One", "Two", "Three");
console.log(listHTML);
演示:Fiddle