Javascript вызов вложенной функции - PullRequest
32 голосов
/ 11 января 2012

У меня есть следующий фрагмент кода:

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

Можно ли как-нибудь вызвать функцию validate(), кроме функции initValidation()?Я пытался вызвать validate(), но я думаю, что он виден только внутри родительской функции.

Ответы [ 7 ]

94 голосов
/ 11 января 2012

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

    initValidation();
    initValidation.validate( "hello" );
    //test hello
16 голосов
/ 11 января 2012

Надеюсь, что вы ищете что-то вроде этого

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

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

Это сработает.

Надеюсь, что это решит вашу проблему.

6 голосов
/ 11 января 2012

Вы можете позвонить validate из initValidation. Вот так.

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

    return validate(someVar);
}

validate не виден никому за пределами initValidation из-за его области действия .

Редактировать: Вот мое предложение решения.

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

    function initValidation()
    {
        // irrelevant code here

        return validate(someVar);
    }

    function otherFunctions() {
        // ...
    }

    // initValidation = function
}());

// initValidation = undefined

Все ваши функции будут скрыты от чего-либо, находящегося вне оболочки функций, но все они могут видеть друг друга.

2 голосов
/ 05 октября 2017

Этот вызов вернет оператор функции, который является функцией validate. Таким образом, вы можете вызывать сразу после первого вызова.

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

initValidation()();
0 голосов
/ 11 июня 2019

Я знаю, что этот поток существует здесь уже довольно давно, но я подумал, что я бы также оставил свои 0,02 $ на том, как вызывать внутренние функции из-за пределов их возможностей (это может кому-то помочь).

Обратите внимание, что в любом месте, , следует принимать во внимание лучшее дизайнерское решение, а не какой-то хакерский обходной путь, который позже укусит вас .

Как насчет использования выражений функций вместо операторов функций и использования 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');
      }

Или вы можете использовать замыканий :

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());
0 голосов
/ 15 июня 2016

Я знаю, что это старый пост, но если вы хотите создать набор экземпляров, с которыми вы хотите работать, повторно использовать код, вы можете сделать что-то вроде этого:

"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);
0 голосов
/ 11 января 2012

Должно работать.

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

    }
}
...