我有以下代码:
function initValidation()
{
// irrelevant code here
function validate(_block){
// code here
}
}
有什么办法可以在validate()
函数之外调用initValidation()
函数吗?我试过调用validate()
,但我认为它只在父函数中可见。
答案 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()