首页 > 解决方案 > JavaScript 闭包函数

问题描述

我是 JavaScript 新手,目前正在研究闭包。您可以在下面看到我的代码,该代码应该打印任何给定数组,每个元素之间具有指定的分隔符。问题是,如果我尝试创建一个数组并在 makePath() 函数中打印它,一切正常。但是当我尝试在主函数中做同样的事情时,它就不起作用了。当我尝试将分隔符与数组连接时,我还有一个问题,分隔符打印在列表的末尾,我不希望这样。

var makePath;

function makePath(separator) {
  let comp = []
  return function(element)

  {
    comp.push(element)
    return comp.join(separator)
  }
}

var path0 = makePath("/");
path0("A");
path0("B");
path0("C");
console.log("path 0 is " + path0());


var main = function() {

  var path1 = makePath("/");

  path1("A");
  path1("B");
  path1("C");

  var path2 = makePath("-->");
  path2("Berlin");
  path2("San Francisco");
  path2("Vancouver");

  var path3 = makePath();
  path3("A");
  path3("B");
  path3("C");

  window.console.log("path 1 is " + path1());
  window.console.log("path 2 is " + path2());
  window.console.log("path 3 is " + path3());
}

输出是:

path 0 is A/B/C/

标签: javascriptfunctionclosures

解决方案


Q1:为什么makePathmain() 中的函数不起作用?
Ans:你只声明了main函数,没有调用它,main()最后加上就行了!

Q2:为什么在输出字符串的末尾有一个额外的分隔符?
答:问题出在这里:console.log("path 0 is " + path0());.
你调用了一个额外的path0(),这使得你的 Arraycomp变成了 ['A', 'B', 'C', ' ' ]。

您可以像这样修改您的代码:

var path0 = makePath("/");
path0("A");
path0("B");
let finalResult = path0("C");
console.log("path 0 is " + finalResult);

如果没有额外的调用,结果应该会按您的预期工作。


推荐阅读