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()
或访问 C
或 D
,您可以像 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/