displayName()有什么区别;并返回displayName;?

时间:2018-05-28 16:26:42

标签: javascript closures

我是一位有抱负的前端开发人员。我正在阅读一篇关于 JavaScript中的闭包的MDN文章。 MDN文章使用以下两个代码示例来解释基本概念。虽然我理解了基本概念,但我有以下疑问。

displayName();return displayName之间有什么区别?

function init() {
  var name = 'Mozilla'; // name is a local variable created by init
  function displayName() { // displayName() is the inner function, a closure
    alert(name); // use variable declared in the parent function    
  }
  displayName();    
}
init();

**

function makeFunc() {
  var name = 'Mozilla';
  function displayName() {
    alert(name);
  }
  return displayName;
}

var myFunc = makeFunc();
myFunc();

2 个答案:

答案 0 :(得分:0)

在第一种情况下它正在执行该函数,而在第二种情况下makeFunc正在返回另一个函数。检查console.log。这就是()之后myFunc()执行makeFunc

返回的函数的原因

function init() {
  var name = 'Mozilla';

  function displayName() {
    alert(name);
  }

  displayName();
}
init();

function makeFunc() {
  var name = 'Mozilla';

  function displayName() {
    alert(name);
  }
  // this is returning a function
  console.log(displayName)
  return displayName;
}

var myFunc = makeFunc();
// since it is returning a function it is getting executed ony after adding () with it
myFunc();

答案 1 :(得分:0)

  

displayName()和return displayName有什么区别?

不同之处在于,第一个是调用函数displayName,而第二个是返回它。要查看这意味着什么的示例:

const log = () => console.log('I was invoked!')

const getLog = () => {
  return log
}

const doLog = () => {
  log()
}

我们有一些功能,当调用时,会打印到控制台。我们还有另外两个函数,一个是返回 log,另一个是调用它。当我们调用getLog()时,我们看不到打印到控制台的任何内容。当我们致电doLog()时,我们会这样做。

另一点是getLog 返回log的值。所以我们也可以这样做:

const logByDifferentName = getLog()

不会导致log被调用,而是将其分配给另一个值。