4

クラスまたは var オブジェクトの関数を引数として別の関数に渡しています。クラスから関数を取り込んだ関数がその関数を実行します。正常に動作しますが、クラスの関数はクラスから別の関数を呼び出します。コンソールは、クラス関数で呼び出されている関数が未定義であるというエラーを出力します。

以下は、もう少しよく説明するかもしれません

//the class variable in someClass.js
function(params...){
  getSomethingInClass: function(){
     // return some variable
  }

  functionThatIsPassed: function(arg){
    var theCalledFunction = getSomethingInClass();
    //do something with theCalledFunction
  }
}

//SOME WHERE ELSE in another function in another file
OtherFunction: function(){
//someClass is a variable being used here
  FunctionThatTakesFunction(this.someClassVar.functionThatIsPassed);
}


//FunctionThatTakesFunction is implemented in another file
FunctionThatTakesFunction(callbackFun){
  callbackFun(someArg);
}

上記は、オブジェクト someClass オブジェクト全体を渡すように変更すると機能します。FunctionThatTakesFunction はその引数の関数を知る必要があるため、オブジェクトを渡すことはプログラミングの悪い方法です。たとえば

//THIS WORKS!
//other stuff is same 

//SOME WHERE ELSE in another function in another file
OtherFunction: function(){
//someClass is a variable being used here
  FunctionThatTakesFunction(this.someClassVar);
}


//FunctionThatTakesFunction is implemented in another file
FunctionThatTakesFunction(object){
  object.functionThatIsPassed(someArg);
}
4

2 に答える 2

1

関数を別の関数に渡す例をいくつか示します: (ここでフィドル: http://jsfiddle.net/FvyUQ/4/ )

function Cat() {
  this.myMeow = 'Mrrow';

  this.scratch = function() {
    console.log('Scritchey-scratch.');
  }
}

Cat.prototype.meow = function() {
  console.log(this.myMeow);
}

Cat.prototype.jump = function() {
  console.log('The cat jumped and said ' + this.myMeow + '!');
}

function test(fn) {
  fn();
}

function callPrototype(fn, context) {
  fn.call(context);
}

var myCat = new Cat();

test(myCat.scratch);
test(myCat.meow);
test(myCat.jump);
test(Cat.prototype.jump);
callPrototype(Cat.prototype.jump, myCat);
于 2013-07-31T20:53:36.273 に答える
0

私は閉鎖を使用します:

class Sample() {
    constructor() {
        this.id = 'Sample';
    }

    method(text) {
        console.log(this.id + text)
    }

    getMethod() {
        const ref = this;
        return function(text) {
            ref.method(text);
        }
    }
}

他の場所:

someFunc() {
    const sample = new Sample();
    useFunc(sample.getMethod());
}

useFunc(func) {
    func('HI');
}

出力: SampleHI

于 2021-01-05T15:33:17.043 に答える