理解javascript

时间:2015-04-23 10:27:25

标签: javascript

嘿伙计们我对java脚本很新,但是已经阅读了一些关于js的初学者书籍,我正在通过MDN文档来了解arguments在js中是如何工作的,并且遇到了以下脚本:

    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

2 个答案:

答案 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