Функция Javascript с обратным вызовом, который передает инициированный объект в качестве параметра - PullRequest
0 голосов
/ 28 декабря 2011

Я пытаюсь расширить некоторые существующие функции, чтобы у них была функция обратного вызова, которая передает исходный объект в качестве параметра, или, по крайней мере, любые общедоступные переменные, которые хранятся в меньшем объекте, как я могу этого добиться?

Это упрощенная версия файла, с которым я работаю, класс будет содержаться в переменной

<html>
<head>
</head>
<script>

var foo = new Foo ({
    arg1:1,
    onComplete: function(){
        alert("complete " + total);
    }
});

</script>
<body>
</body>
</html>

Функция / класс выглядит примерно так

function Foo(options) {
    // private
    var number1_ = options.arg1;
    var number2_ = 10;
    var total_ = number1_ + number2_;

    // public
    this.total = total_;

    (function Foo() {
        if (options) {
            if (options.onComplete && typeof (options.onComplete) === "function") {

                // how do I pass Foo or an object of selected variables here?
                options.onComplete();
            }
        }
    })();
}

Спасибо

Ответы [ 4 ]

2 голосов
/ 28 декабря 2011

Проверьте это:)

function Foo(options) {
    // private
    var number1_ = options.arg1,
        number2_ = 10,
        total_ = number1_ + number2_;
    // public
    this.total = total_;

    (function Magazine( that ) {

        (options.onComplete || function(){}).call( that );

    })(this);
}

var foo = new Foo({
    arg1: 1,
    onComplete: function() {

        alert("complete " + this.total);
    }
});

Демонстрация в реальном времени: http://jsfiddle.net/P3bzM/

2 голосов
/ 28 декабря 2011
(function Magazine() {
    if (options) {
        if (options.onComplete && typeof (options.onComplete) === "function") {

            // if you want `this === the foo instance` in the function:
            options.onComplete.call(this);
            // otherwise just pass it as an argument:
            options.onComplete(this);
        }
    }
}).call(this);
1 голос
/ 28 декабря 2011

У вас есть несколько способов достичь этого.

  1. Просто добавьте параметры при вызове обратного вызова:

    if (options.onComplete && typeof (options.onComplete) === "function") {
    
        // how do I pass Foo or an object of selected variables here?
        options.onComplete(this.number1_, this.number2_, this.total_);
    }
    
  2. Используйте метод javascript .call () или .apply (), чтобы установить контекст обратного вызова (что будет this в обратном вызове)

    if (options.onComplete && typeof (options.onComplete) === "function") {
    
        // how do I pass Foo or an object of selected variables here?
        options.onComplete.apply(this);
        // options.onComplete.call(this);
    }
    

    Оба метода работают одинаково, они просто отличаются способом передачи аргументов в метод. Прочитайте это , чтобы получить больше информации

1 голос
/ 28 декабря 2011
<html>
<head>
</head>
<script>

var foo = new Foo ({
    arg1:1,
    onComplete: function(total){
        alert("complete " + total);
    }
});

</script>
<body>
</body>
</html>


function Foo(options) {
    // private
    var number1_ = options.arg1;
    var number2_ = 10;
    var total_ = number1_ + number2_;

    // public
    this.total = total_;

    (function Magazine() {
        if (options) {
            if (options.onComplete && typeof (options.onComplete) === "function") {

                // how do I pass Foo or an object of selected variables here?
                options.onComplete(total_);
            }
        }
    })();
}

Найдите слово «итого», чтобы увидеть изменения.

...