是否有可能从javascripot中的闭包外部调用f1()函数

时间:2015-05-25 05:30:37

标签: javascript function closures

function mainFunc(){
  function f1(){
    alert("f1");
  }
  function f2(){
    alert("f2");
  }
}

function myFun(){
  var data = f1();
}

是否有可能在javascript中从闭包外部调用f1()函数。

5 个答案:

答案 0 :(得分:2)

如果使用mainFunc创建对象,则可以访问其中的方法。

function mainFunc(){
  this.f1 = function (){
    alert("f1");
  }
  this.f2 = function(){
    alert("f2");
  }
}

function myFun(){
  var mainObj = new mainFunc();
  var data = mainObj.f1();
}

myFun();

答案 1 :(得分:0)

尝试返回一个仍然可以访问mainFunc闭包中定义的函数的对象!

有点乱,但希望它有所帮助:

function mainFunc(){
  function f1(){
    alert("f1");
  }
  function f2(){
    alert("f2");
  }

  return {
    f1 : f1,
    f2 : f2
  };
}


function myFun(){
  var data = mainFunc().f1();
}

闭包背后的想法是保护,同时提供对闭包范围内的值的访问。

如果您还没有,请查看以前的主题。 我很喜欢这个史诗般的答案:
How do JavaScript closures work?

答案 2 :(得分:0)

试试这个。

var mainFunc = new mainFunc();
function mainFunc(){
  this.f1 = f1;
  this.f2 = f2;
  function f1(){
    alert("f1");
  }
  function f2(){
    alert("f2");
  }
}

function myFun(){
  var data = mainFunc.f1();
}

答案 3 :(得分:0)

你基本上必须将该功能传递出去或以某种方式使其可访问

有很多方法可以做到这一点。

以下是使用回调函数的示例。所以将函数作为参数传递给mainFunc。您传入的函数本身期望将两个函数f1 anf f2传递给它。

function mainFunc(cb){
  var f1 = function(){
    console.log("f1");
  }
  var f2 = function(){
    console.log("f2");
  }

  cb(f1, f2);
}

//this example uses an anonymous function as a callback
mainFunc(function(fnA, fnB){
    fnA();
    fnB();
})

//this example uses your named function myFun as a callback
function myFun(fnA, fnB){
    fnA();
    fnB();
}
mainFunc(myFun);

答案 4 :(得分:0)

尝试使用Function.prototype.toString()Function



function mainFunc(){
  function f1(){
    alert("f1");
  }
  function f2(){
    alert("f2");
  }
}

function myFun(){
  var f1 = "";
  var res = mainFunc.toString().split("\n");
  for (var i = 0; i < res.length; i++) {
    if (res[i].indexOf("f1") !== -1) {
      f1 += res[i].trim();
    }
    if (res[i].indexOf("}") !== -1 
        && res[i -1].indexOf("f1") !== -1) {
      f1 += res[i].trim();
    }
  };
  f1 = new Function("(" + f1 + "())");
  f1();
}

myFun();
&#13;
&#13;
&#13;