Подтвердить что ты не робот

Как определить, была ли вызвана функция без установки глобальной переменной

Я ищу хорошую технику, чтобы уйти от того, что я искушаюсь: установить глобальную переменную.

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

4b9b3361

Ответ 1

Вы можете добавить свойство к функции:

function init() {
    init.called = true;
}

init();

if(init.called) {
    //stuff
}

Ответ 2

Хотя ответ @Levi должен работать нормально, я хотел бы представить еще один вариант. Вы должны написать функцию init, чтобы ничего не делать, как только она была вызвана.

var init = function () {
   // do the initializing

    init = function() {
        return false;
    }
};

Функция, вызываемая в первый раз, выполнит инициализацию. Затем он будет немедленно перезаписывать себя, чтобы возвращать false в следующий раз после его вызова. Во второй раз, когда функция вызывается, тело функции будет содержать только return false.

Подробнее: http://www.ericfeminella.com/blog/2011/11/19/function-overwriting-in-javascript/

Ответ 3

Почему бы вам просто не проверить, есть ли у ваших draggables класс draggable на них?

if ($('.mydiv').is('.draggable')) {
     //do something
}

Ответ 4

Function.prototype.fired = false;

function myfunc() { 
    myfunc.fired = true; 
    // your stuff
};

console.log(myfunc.fired) // false

myfunc();

console.log(myfunc.fired) // true

Ответ 5

Что вы можете сделать, это отменить функцию init из прототипа.

​var Obj = function () {
    this.init = function () {
        document.write("init called<br/>");
        this.init = null;
    }
}
var o = new Obj();
if (o.init) document.write("exists!<br/>");
o.init();
if (o.init) document.write("exists!<br/>");
o.init();

Первый if будет истинным и напечатать exists!, но поскольку функция удалит себя, второй if завершится с ошибкой. В моем примере я вызываю второй init безоговорочно только для того, чтобы показать, что ничего не произойдет, но, конечно, вы можете называть его только в том случае, если он существует:

if (o.init) o.init();

http://jsfiddle.net/coreyog/Wd3Q2/