我正在学习JS并且想知道,有没有办法在不返回foo()的情况下返回函数bar()或buz()?例如,如果我想返回功能栏();得到2,我可以这样做吗?会不会像foo()。bar(); ?
// Nested Scopes
function foo() { // can only access itself
var a = 1;
function bar() { // access to foo(), not buz()
var b = 2;
function buz() { // access to bar() and foo()
var c = 3;
console.log(a, b, c); // 1, 2, 3
}
buz();
console.log(a, b); // 1, 2
}
bar();
console.log(a); // 1
}
foo(); // 1
答案 0 :(得分:1)
当然可以。您可以在保存函数的每个阶段返回一个对象,也可以返回该函数本身。这利用了所谓的closure。
function foo() {
var a = 1;
function bar() {
var b = 2;
function buz() {
var c = 3;
console.log(a, b, c);
}
console.log(a, b);
return { buz: buz };
}
console.log(a);
return { bar: bar };
}
foo().bar().buz();

答案 1 :(得分:0)
这样做更像是设置变量。
var foo = {
bar: function() {
return 3;
}
}
console.log(foo.bar());
答案 2 :(得分:0)
你可以做到这一点,但它过于复杂了。
基本语法是:
foo().bar().buz();
无论你在现有版本之后添加另一个()
,它都会打印出该级别。有关示例,请参阅代码段。
// Nested Scopes
function foo() { // can only access itself
var a = 1;
function bar() { // access to foo(), not buz()
var b = 2;
function buz() { // access to bar() and foo()
var c = 3;
return (function() {
console.log(a, b, c);
});
}
return (function() {
var tmp = function() {
console.log(a, b);
return {
buz: buz
};
};
tmp.buz = buz;
return tmp;
})();
}
return (function() {
var tmp = function() {
console.log(a);
return {
bar: bar
};
};
tmp.bar = bar;
return tmp;
})();
}
foo().bar().buz(); // (nothing)
foo().bar()().buz(); // 1, 2
foo()().bar()().buz(); // 1 // 1, 2
foo()().bar().buz()(); // 1 // 1, 2, 3
foo()().bar()().buz()(); // 1 // 1, 2 // 1, 2, 3
这种滥用可以为JavaScript中的任何内容指定属性,包括函数。
foo
是一个引用外foo
。foo()
是另一个引用内部tmp
的函数,它具有引用内部bar
函数的bar
属性。foo()()
实际上调用了内部tmp
函数,但仍然留下了一个具有bar
属性的对象,该属性再次引用内部bar
函数。这种方法与bar
基本相同。
对于buz
,(something).buz()
只是一个函数,没有任何额外属性,(something).buz()()
不会返回任何内容,因为这是最终级别。