为什么我不能使用点语法访问返回的函数

时间:2018-08-30 20:18:40

标签: javascript closures

尽管,一旦createFunction运行,我将可以访问内部函数。

function createFunction() {
  function printHello() {
    return console.log("hello");
  }
  return printHello;
}

// Both of these return undefined
createFunction(printHello());
createFunction.printHello();

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

正确的语法是:

createFunction()();

...或者有点罗::

const returnedFunction = createFunction();
returnedFunction();

...作为printHello的名称仅在createFunction中有意义,但是它的值实际上是由该函数返回的。是的,按顺序放置任意数量的()是完全可以的。

作为一个旁注,返回console.log('hello')的结果几乎没有意义:记录本身是一个副作用,无需检查其结果。

答案 1 :(得分:1)

  

尽管,一旦createFunction运行,我将可以访问内部函数。

否,您不能访问其外部函数内部的变量。如果调用函数,则这些变量存在,但无法访问它们。但是,如果值被return赋值,则可以像使用该表达式一样使用函数调用。在您的情况下,您可以返回该函数,以便可以通过以下方式访问它:

 var print = createFunction();
 print();

或者作为一个单行:

 createFunction()();

答案 2 :(得分:0)

在您的代码中,createFunction返回另一个函数,因此要执行内部函数,必须通过在createFunction的返回值之后附加()来调用内部函数,即createFunction()();。

createFunction()提供printHello =函数定义
createFunction()()与printHello **()**

相同

如果我们简化了您的代码,我们可以将其重写为

function printHello() {
     console.log("hello");
 };
function createFunction() {
  return printHello;
};
console.log("return value of: createFunction()");
console.log(createFunction());

console.log("return value of: createFunction() () --> printHello()");
createFunction()();