отслеживание нескольких прогонов одной и той же функции, часть 2 - PullRequest
0 голосов
/ 04 февраля 2011

Это относится к этому

В любом случае, мне нужно что-то немного другое, мне нужен какой-то способ сделать это:

function run(arg) {
    this.ran = this.ran || false;
    if (!this.ran) init;
    /* code */
    this.ran = true;
}

Это отлично работает, я просто хочу убедиться, что этот код работает, даже когда this, если он был вызван с помощью call () или apply ()

Проверьте это на то, о чем я говорю, все вызовы после первого должны быть верными, независимо от контекста

Ответы [ 3 ]

1 голос
/ 04 февраля 2011

, чтобы в полной мере использовать замыкания, я предлагаю вам обернуть вашу основную функцию в другую функцию, которая вызывает флаг "run":

function initRun(){
    var ran = ran || false;
    return function(arguments){
        if(ran)
            {
                console.log("can't run any more!");
                return;
            }
        ran = true;
        console.log("i'm running!");
        /* your logic here */
    }
}
var run = initRun();

тогда вы можете проверить это, вызывая вашу функцию так, как вам нужно:

run();
run.call();
run.apply();

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

0 голосов
/ 04 февраля 2011

Когда вы определяете автономную функцию, «this» относится к объекту глобального окна.В таком случае вы можете просто явно использовать глобальную переменную, чтобы избежать любой возможности "узкого" взлома от .apply () или .call () ... при условии, что это желаемое поведение.

function run(arg) {
    window.ran = window.ran || false;
    if (!window.ran) init();
    /* code */
    window.ran = true;
}

В качестве примечания: если вы определяете функцию как свойство объекта, «this» относится к объекту-владельцу.Обратите внимание, что «this» является ссылкой на владельца функции, а владелец зависит от контекста.

РЕДАКТИРОВАТЬ: кроме того, как продолжение предложения @ Anurag, это не подходит?

0 голосов
/ 04 февраля 2011

вы можете заменить «this» на «arguments.callee».arguments.callee всегда должен предоставлять вам объект, представляющий вашу текущую функцию, таким образом изолируя вас от изменения «this».(Однако я не тестировал ^^)

...