JavaScript访问函数内的函数

时间:2014-08-27 02:38:54

标签: javascript function scope

A(); // prints 'a'

function A() { console.log('a'); }
function B() {
    function C() { console.log('c'); }
    function D() { console.log('d'); }
    console.log('b');
}

如何在不改变功能B内容的情况下从B外部调用C或D函数?

例如,我想要将B()更改为:

function B(arg)
{
 function C() { console.log('c'); }
 function D() { console.log('d'); }

 if (arg == 'C')
  C();
 if (arg == 'D')
  D();

 console.log('b');
}

5 个答案:

答案 0 :(得分:2)

C()D()B()范围内的私有的本地函数。它们就像局部变量。它们仅存在于B()的范围内。这就是Javascript中的作用域的工作原理。

您不能在B()之外访问它们,除非您将对它们的引用传递给其他函数,从函数返回它们或更改结构以便将它们声明或分配到更高级别的范围而不是在B()


例如,您可以将对它们的引用传递给另一个函数:

function B() {
    function C() { console.log('c'); }
    function D() { console.log('d'); }
    console.log('b');
    setTimeout(C, 1000);
}

然后,当您致电B()时,它会先输出b,然后在1秒后输出c


或者,您可以通过使这些函数成为B函数对象的属性来更改其结构:

function B() {
    B.C = function() { console.log('c'); }
    B.D = function() { console.log('d'); }
    console.log('b');
}

然后,您可以致电B()或访问CD,您可以将其称为B.C()


或者,您可以从B()返回一个包含两个函数的对象:

function B() {
    var obj = {};
    obj.C = function() { console.log('c'); }
    obj.D = function() { console.log('d'); }
    return obj;
}

var functions = B();
functions.C();

或者,您可以使B()成为构造函数:

function B() {
    this.c = function() { console.log('c'); }
    this.d = function() { console.log('d'); }
    return obj;
}

var obj = new B();
obj.c();

仅供参考,Javascript中的常规约定是构造函数以大写字母开头,其他函数/方法以小写字母开头。

答案 1 :(得分:1)

根据javascript范围,您无法从B()外部访问它们。

您必须修改B()才能访问它们。

答案 2 :(得分:0)

您已B()设置为constructor。如果要访问B()的内部函数,则需要使用new关键字创建新的实例。但是,C()D()是私有函数。我们可以改变它们的公共功能:

function B() {
    console.log('b');
    this.C = function() { console.log('c'); } //public function
    function D() { console.log('d'); } //private function (no this keyword)
}

然后,您必须创建B()实例才能访问其public值。

var b = new B(); //logs 'b'
b.C(); //logs 'c'
b.D(); //throws an error because D() is private

答案 3 :(得分:0)

无法从外部B访问C或D.这里有一些替代选项:

function A() { console.log('a'); }
function B() {
    function C() { console.log('c'); }
    function D() { console.log('d'); }
    return {
       C: C,
       D: D
    };
}

B().C();
B().D();

var C, D;
function A() { console.log('a'); }
function B() {
    C = function() { console.log('c'); }
    D = function() { console.log('d'); }
}
B();
C();
D();

答案 4 :(得分:0)

我猜你正在寻找一种方法将参数传递给B而不修改它吗? ?那怎么样..

function ABC(arg){
 function B()
 {
  function C() { console.log('c'); }
  function D() { console.log('d'); }

  if (arg == 'C')
   C();
  if (arg == 'D')
   D();

  console.log('b');
 }

 B();
}

我猜你正在寻找这条线的解决方案。