如何调用在另一个函数中声明的子函数

时间:2019-05-08 10:30:15

标签: javascript node.js function

函数b在函数a中声明。所以,我试图在功能a之外调用功能b。它没有被调用。

var a = function() {
  alert("a");
  var b = function() {
    alert("b");
  }
}

输出:- 函数b称为 带有消息b的警报框

6 个答案:

答案 0 :(得分:1)

您需要返回b并使用它。首先将涉及调用函数a,但是您将拥有一个可以反复调用以提醒b的函数:

var a = function() {
  alert("a");
  var b = function() {
    alert("b");
  }
  return b;
}

var messageB = a();
messageB();
messageB();

答案 1 :(得分:0)

尝试在“ a”函数外部声明“ b”变量:

var b;
var a = function() {
    alert("a");
    b = function() {
        alert("b");
    };
};

这样,您可以从b外部访问a,因为它是在a外部声明的。在第一次调用undefined之前,它将是b,因此您不能在a之前调用a。另外,如果您两次致电b,则前一个 var b; var a = function(name) { b = function() { alert(name); }; }; a("first version"); b(); // first version a("second version"); b(); // second version 将被覆盖。如下所示:

a

如果您不需要b var a = function() { alert("a"); }; var b = function() { alert("b"); }; 内的任何内部变量,则没有理由嵌套这些函数,在这种情况下,您应该只有两个独立的函数:

{{1}}

答案 2 :(得分:0)

首先返回该函数并调用它,

var a = function() {
  alert("a");
  var b = function() {
    alert("b");
  }
  return b;
}

var b = a();
b();

答案 3 :(得分:0)

如上所述,您可以简单地返回函数b。 Java语言中的函数可以像这样传递,这是垃圾收集语言的一个很好的功能。

但是您可以做得更好,如果您想公开多个功能呢?

您可以返回带有附加方法的对象。

function A() {
  let value = 0;
  return {
    inc: () => ++ value,
    dec: () => -- value,
    show: () => console.log(value)
  }
}

const a1 = A();
a1.inc(); a1.inc(); a1.show();

const b1 = A();
b1.inc(); b1.dec(); b1.dec(); b1.show();

现在,上面的内容看起来与所谓的class非常相似,但事实并非如此。这样做的一个缺点是,如果您想创建数千个实例,则一个类会更好,因为它可以将其方法放在原型上。但是话说回来,就像使用React Hooks所发现的那样,那还不是那么糟糕。

上述优点之一是,您不必进入this实例上下文的泥泞世界。

为完整起见,这里是一个类版本。

class A {
  value = 0;
  inc() { ++ this.value; }
  dec() { -- this.value; }
  show() { console.log(this.value) }
};

const a1 = new A();
a1.inc(); a1.inc(); a1.show();

const b1 = new A();
b1.inc(); b1.dec(); b1.dec(); b1.show();

也有人说,一个简单的解决方案是使ab都为全局变量,但是越避免使用全局变量越好,所以如果ab有一些共同的意图,使用闭包甚至一个类会更好。

答案 4 :(得分:0)

或者如果您需要对象批准

`var a = function() {
  print("a");
  this.b = function() {
    print("b");
  }
  return this
}
a().b()`

答案 5 :(得分:0)

所有其他答案都足够好,但是以防万一,您可能喜欢这种directly calling inner function without returning这种方法。

您可以简单地包装内部函数(即b)作为这样的自调用函数,

var a = function() {
  alert("a");
  var b = (function() {
    alert("b");
  })()
}

Ref