Javascript调用嵌套函数

时间:2012-01-11 10:39:01

标签: javascript nested-function

我有以下代码:

function initValidation()
{
    // irrelevant code here
    function validate(_block){
        // code here
    }
}

有什么办法可以在validate()函数之外调用initValidation()函数吗?我试过调用validate(),但我认为它只在父函数中可见。

11 个答案:

答案 0 :(得分:91)

    function initValidation()
    {
        // irrelevant code here
        function validate(_block){
            console.log( "test", _block );
        }
    
        initValidation.validate = validate;
    }

    initValidation();
    initValidation.validate( "hello" );
    //test hello

答案 1 :(得分:16)

希望您正在寻找类似的东西

function initValidation()
{
    // irrelevant code here
    this.validate = function(_block){
        // code here
    }
}

var fCall = new initValidation()
fCall.validate(param);

这样可行。

希望这可以解决您的问题。

答案 2 :(得分:6)

您可以在validate内致电initValidation。像这样。

function initValidation()
{
    // irrelevant code here
    function validate(_block){
        // code here
    }

    return validate(someVar);
}
由于scope validate以外的任何内容,

initValidation不可见。

编辑:以下是我对解决方案的建议。

(function() {
    function validate(_block){
        // code here
    }

    function initValidation()
    {
        // irrelevant code here

        return validate(someVar);
    }

    function otherFunctions() {
        // ...
    }

    // initValidation = function
}());

// initValidation = undefined

所有函数都将隐藏在函数包装器之外的任何函数中,但都可以看到彼此。

答案 3 :(得分:2)

此调用将返回函数语句,即函数validate。 所以你可以在第一次调用后直接调用。

function initValidation() {
  // irrelevant code here
  return function validate(_block) {
    // code here
  }
}

initValidation()();

答案 4 :(得分:1)

在父函数之外创建一个变量,然后在父函数中将所需的函数存储在该变量中。

Var Store;
Function blah() {

    Function needed() {
        #
    }

   Store = needed;
}

答案 5 :(得分:0)

我知道这是一篇旧帖子,但如果您希望创建一组您希望使用的实例,重用代码,您可以执行以下操作:

"use strict";
// this is derived from several posts here on SO and ultimately John Resig
function makeClassStrict() {
  var isInternal, instance;
  var constructor = function(args) {
    if (this instanceof constructor) {
      if (typeof this.init == "function") {
        this.init.apply(this, isInternal ? args : arguments);
      }
    } else {
      isInternal = true;
      instance = new constructor(arguments);
      isInternal = false;
      return instance;
    }
  };
  return constructor;
}
var MyClass = makeClassStrict();// create "class"
MyClass.prototype.init = function(employeeName, isWorking) {
  var defaultName = 'notbob';
  this.name = employeeName ? employeeName : defaultName;
  this.working = !!isWorking;
  this.internalValidate = function() {
    return {
      "check": this.working,
      "who": this.name
    };
  };
};
MyClass.prototype.getName = function() {
  return this.name
};
MyClass.prototype.protoValidate = function() {
return {
      "check": this.working,
      "who": this.name
    };
};
var instanceBob = MyClass("Bob", true);// create instance
var instanceFred = MyClass("Fred", false);// create instance
var mything = instanceFred.internalValidate();// call instance function
console.log(mything.check + ":" + mything.who);
var myBobthing = instanceBob.protoValidate();
console.log(myBobthing.check + ":" + myBobthing.who);

答案 6 :(得分:0)

我知道这个线程已经存在了很长时间,但是我想我也应该把0.02美元留给如何从它们的作用域之外调用内部函数(这可能会使某人受益)。

请注意,在任何地方,都应该考虑一个更好的设计决策,而不要考虑一些棘手的变通办法,这会在以后给您带来麻烦

如何使用function expressions代替function statements并利用global scope

      var innerFn;
    
      function outerFn() {
        innerFn = function(number) {
          return number ** 2;
        }
      }
    
      outerFn();
      console.log(innerFn(5));

      // if there's more complex code around and you could write this defensively

      if (typeof innerFn !== 'undefined') {
        console.log(`we are squaring the number 5 and the result is: ${innerFn(5)}`);
      } else {
        console.log('function is undefined');
      }

或者,您可以使用closures

function outer() {
  // initialize some parameters, do a bunch of stuff
  let x = 5, y = 10;

  function inner() {
    // keeps references alive to all arguments and parameters in all scopes it references
    return `The arithmetic mean of the 2 numbers is: ${(x + y) / 2}`;
  }
  
  return inner;
}

innerFn = outer(); // get a reference to the inner function which you can call from outside
console.log(innerFn());

答案 7 :(得分:0)

作为 Esailija 答案的一个小变化,我这样做了:

function createTree(somearg) {
    function validate(_block) {
        console.log( "test", _block );
    }
    if (somearg==="validate") { return validate; } // for addNodes

    // normal invocation code here
    validate(somearg);
}

function addNodes() {
    const validate = createTree("validate");
    //...
    validate( "hello" );
}

createTree("create");
addNodes();
//validate("illegal");

因此 validate() 现在在 createTree() 和 addNodes() 之间完美共享,并且对外界完全不可见。

答案 8 :(得分:-1)

应该工作。

function initValudation() {
    validate();
    function validate() {

    }
}

答案 9 :(得分:-1)

函数定义:

function initValidation() {
   // code here
   function validate(_block){
     // code here
     console.log(_block);
   }
   return validate;
}

如下调用:

initValidation()("hello");

答案 10 :(得分:-1)

function initValidation()
{
   
    function validate(_block){
        console.log(_block)
        // code here
    }
    // you have to call nested function
    validate("Its Work")
}

// call initValidation function
initValidation()