私は次のコードを持っています:
_function initValidation()
{
// irrelevant code here
function validate(_block){
// code here
}
}
_
validate()
関数の外でinitValidation()
関数を呼び出す方法はありますか? validate()
を呼び出してみましたが、親関数内でのみ表示されると思います。
function initValidation()
{
// irrelevant code here
function validate(_block){
console.log( "test", _block );
}
initValidation.validate = validate;
}
initValidation();
initValidation.validate( "hello" );
//test hello
あなたがこのようなものを探していることを願っています
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);
}
validate
は、 scope のため、initValidation
の外部には表示されません。
編集:ここに解決策の提案があります。
(function() {
function validate(_block){
// code here
}
function initValidation()
{
// irrelevant code here
return validate(someVar);
}
function otherFunctions() {
// ...
}
// initValidation = function
}());
// initValidation = undefined
すべての関数は、関数ラッパーの外側に隠されますが、すべて互いに見えます。
この呼び出しは、関数検証である関数ステートメントを返します。したがって、最初の呼び出しの後に直接呼び出すことができます。
function initValidation() {
// irrelevant code here
return function validate(_block) {
// code here
}
}
initValidation()();
私はこのスレッドがかなり前から存在していることを知っていますが、スコープ外から内部関数を呼び出す方法についても0.02 $を残しておくと思いました(誰かに役立つかもしれません)。
いずれにせよ、後であなたに噛み付くようなハック的な回避策ではなく、より良い設計上の決定を考慮する必要があることに注意してください。
関数文 の代わりに 関数式 を使用し、 グローバルスコープ を使用してください。
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());
私はこれが古い投稿であることを知っていますが、コードを再利用して作業したいインスタンスのセットを作成したい場合は、次のようなことができます:
"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);