JavaScript 访问函数内的函数

标签 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 外部调用函数 C 或 D,而不持续更改函数 B 的内容?

例如,我不想将 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');
}

最佳答案

C()D()B() 范围私有(private)的本地函数。它们就像局部变量。它们仅存在于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 中的常规约定是构造函数以大写字母开头,其他函数/方法以小写字母开头。

关于JavaScript 访问函数内的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25518118/

相关文章:

javascript - SharePoint 2013获取列表项字段值

javascript - React 应用程序在元素上返回 null?

list - 将 map 与函数一起使用

c++ - esms.cpp :234: error: 'the_config' was not declared in this scope

c# - 文件下载到浏览器后如何修改页面?

javascript - 将javascript注入(inject)javascript函数

javascript - 有没有办法将 javascript 应用到一个输入字段?

密码程序 — 错误 : unused variable

scope - TouchableHighLight onPress 在 react native 的 map 函数内

javascript - 如何使用 Angular Messages 显示字段名称及其有效值?