Вложенная функция вызова JavaScript
У меня есть следующий фрагмент кода:
function initValidation()
{
// irrelevant code here
function validate(_block){
// code here
}
}
Можно ли каким-либо образом вызвать функцию validate()
вне функции initValidation()
? Я пробовал называть validate()
, но я думаю, что он видимый только внутри родительской функции.
Ответы
Ответ 1
function initValidation()
{
// irrelevant code here
function validate(_block){
console.log( "test", _block );
}
initValidation.validate = validate;
}
initValidation();
initValidation.validate( "hello" );
//test hello
Ответ 2
Надеюсь, что вы ищете что-то вроде этого
function initValidation()
{
// irrelevant code here
this.validate = function(_block){
// code here
}
}
var fCall = new initValidation()
fCall.validate(param);
Это будет работать.
Надеюсь, это поможет решить вашу проблему.
Ответ 3
Вы можете вызвать validate
из initValidation
. Вот так.
function initValidation()
{
// irrelevant code here
function validate(_block){
// code here
}
return validate(someVar);
}
validate
не отображается никем вне initValidation
из-за его scope.
Изменить: Здесь мое предложение о решении.
(function() {
function validate(_block){
// code here
}
function initValidation()
{
// irrelevant code here
return validate(someVar);
}
function otherFunctions() {
// ...
}
// initValidation = function
}());
// initValidation = undefined
Все ваши функции будут скрыты от чего-либо вне оболочки функций, но все могут видеть друг друга.
Ответ 4
Этот вызов будет возвращать оператор функции, который проверяет функцию.
Таким образом, вы можете вызывать непосредственно после первого вызова.
function initValidation() {
// irrelevant code here
return function validate(_block) {
// code here
}
}
initValidation()();
Ответ 5
Я знаю, что это старый пост, но если вы хотите создать набор экземпляров, которые вы хотите использовать с повторным использованием кода, вы можете сделать что-то вроде этого:
"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,02 $ на том, как вызывать внутренние функции из-за пределов их видимости (может кому-то это выгодно).
Обратите внимание, что в любом месте следует принимать во внимание лучшее дизайнерское решение, а не какой-то хакерский обходной путь, который позже укусит вас.
Как насчет использования выражений функций вместо операторов функций и использования глобальной области видимости.
var innerFn;
function outerFn() {
innerFn = function(number) {
return number ** 2;
}
}
outerFn();
console.log(innerFn(5));
// if there 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');
}
Ответ 7
Должен работать.
function initValudation() {
validate();
function validate() {
}
}