为什么变量被称为函数?

时间:2018-06-08 10:31:41

标签: javascript

此代码段位于" Eloquent Javascript"中。第3行是什么意思,功能名称在哪里?另外,在第7行中,尽管wrap1是变量,但wrap1被称为函数。



function wrapValue(n) {
  let local = n;
  return () => local;
}
let wrap1 = wrapValue(1);
let wrap2 = wrapValue(2);
console.log(wrap1());
console.log(wrap2());




4 个答案:

答案 0 :(得分:2)

原因是,该变量被赋值给函数调用wrapValue(),该函数返回另一个函数。

当您将变量赋值给函数调用的返回函数时,您必须执行该函数,这就是您将变量作为函数调用执行的原因。

这是#FunctionCeption

让我给你一个简单的例子:

function one() {
  // This function returns another function.
  // Note that this is anonymous function doesn't have a name.
  return function () {
    // This is another function, returned by the first function.
    console.log("I am in the second function.");
  }
}

// Now when you assign this to a function:
var two = one();
// You are getting the value returned by the one function. That's actually a function.

// So now you are executing the two as a function, because it is a function.
two();

在您的情况下,这是使用私有变量的问题。要使用普通JavaScript制作ES6 JavaScript,请转换它:

function wrapValue(n) {
  let local = n;
  return function () {
    return local;
  }
}
let wrap1 = wrapValue(1);
let wrap2 = wrapValue(2);
console.log(wrap1());
console.log(wrap2());

local由父函数设置。所以它根本不可访问。

答案 1 :(得分:1)

wrapValue返回作为函数的对象() => local。这是箭头函数语法(一种匿名函数)。如果您有:

,情况就会一样
function wrapValue(n){
    let local = n; 
    return function() { 
       return local;
    }
}

因此,当调用let wrap1 = wrapValue(1);时,该函数返回以下函数:

function() {
  return 1
}

因此,在致电wrap1()时,您会获得1

回到你问的问题:

  

此外,尽管wrap1是一个变量,第7行wrap1如何被称为函数。

wrap1确实是一个变量,但正如我上面解释的那样它是一个函数。因此,您可以使用括号()调用它,它将执行

答案 2 :(得分:1)

MDN向您解释:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

你的第3行:

return () => local;

意思是:

return function () {
  return local;
}

答案 3 :(得分:1)

() => local是使用anonymous functionarrow notation。写function() { return local; }

是一种简短(但不相同)的方式

这些功能是JavaScript中的一等公民。它们是对象,因此它们可以存储在变量中,作为参数传递或由函数返回。

功能:

function wrapValue(n) {
    let local = n;
    return () => local;
}

返回另一个函数(上面解释的匿名函数() => local)。

声明:

let wrap1 = wrapValue(1);

使用参数wrapValue()调用1,并在wrap1局部变量中存储wrapValue()返回的函数。

声明:

console.log(wrap1());

调用存储在变量wrap1中的函数并打印它返回的值。

我们可以假装wrap1是函数的名称,直到我们在wrap1变量中放入其他内容。