Javascript调用嵌套函数

IT技术 javascript nested-function
2021-01-24 08:26:51

我有以下一段代码:

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

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

6个回答

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

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

我不明白我们为什么要打电话initValidation();有人可以帮帮我吗 ?
2021-03-14 08:26:51
@HarkiratSaluja - 尝试删除initValidation(),你会得到一个错误。原因是首先你需要initValidation.validate()通过调用来初始化initValidation()
2021-03-17 08:26:51
@yuno 请不要对其他人的答案进行“代码打高尔夫球”。
2021-03-27 08:26:51
出于某种原因,我当时没有看到这个答案。我已将其更新为已接受的答案,因为这显然是最好的方法。
2021-03-31 08:26:51
我认为这个答案是真正回答问题的答案。谢谢!
2021-04-13 08:26:51

希望你正在寻找这样的东西

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

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

这将起作用。

希望这能解决您的问题。

您可以validate从内部调用initValidation像这样。

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

    return validate(someVar);
}

validateinitValidation由于其作用域,对 之外的任何东西都不可见

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

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

    function initValidation()
    {
        // irrelevant code here

        return validate(someVar);
    }

    function otherFunctions() {
        // ...
    }

    // initValidation = function
}());

// initValidation = undefined

您的所有函数都将隐藏在函数包装器之外的任何内容中,但都可以相互看到。

如果它仍然不起作用,请尝试调试validate在其中放置一个alert/console.log调用,看看它是否正在执行。
2021-03-16 08:26:51
谢谢。我想从外面调用它initValidation,但我认为这是不可能的。
2021-03-23 08:26:51
您可以尝试将该函数放在initValidation. 当然它会是全局的,但它仍然可以从initValidation. 为什么不将所有函数包装在类似(function() { /* CODE HERE */ }()). 它将阻止一切变得全球化,但允许您的功能相互看到。
2021-04-02 08:26:51
@EduardLuca,如果您想从其封闭范围之外访问该函数(在您的问题中,您在里面说,这恰恰相反),您不应该在内部声明它。那是设计错误。有很多方法可以解决它,但为什么不在需要调用它的地方定义函数呢?
2021-04-11 08:26:51
不,这就是它嵌套的原因。如果您想在 initValidation 函数之外使用它,请不要嵌套它。
2021-04-13 08:26:51

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

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

initValidation()();

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

"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);