在JavaScript中调用嵌套作用域中的内部函数

时间:2017-02-17 04:12:04

标签: javascript

我正在学习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

3 个答案:

答案 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()()不会返回任何内容,因为这是最终级别。