Хобрук: Ваш путь к мастерству в программировании

как определить, что функция была вызвана с помощью javascript

У меня есть функция javascript.

Как проверить:

  • если была вызвана функция (в секции <head></head> есть эта функция), то не вызывать функцию

  • если функция не вызывалась (в секции <head></head> этой функции нет), то вызываем функцию

как require_once или include_once с PHP

26.07.2010


Ответы:


1

Статические переменные

Вот как можно создавать статические (как в C) переменные, используя самовызывающиеся функции для хранения ваших статических переменных в замыкании.

var myFun = (function() {
  var called = false;
  return function() {
    if (!called) {
      console.log("I've been called");
      called = true;
    }
  }
})()

Обобщите идею

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

function makeSingleCallFun(fun) {
  var called = false;
  return function() {
    if (!called) {
      called = true;
      return fun.apply(this, arguments);
    }
  }
}

var myFun = makeSingleCallFun(function() {
  console.log("I've been called");
});

myFun(); // logs I've been called
myFun(); // Does nothing

29.01.2011
  • @SeanPatrickFloyd Вначале я подумал, что callee было опечаткой в ​​названии функции called, но это переменная и она совпадает, поэтому я действительно не знаю, почему за это проголосовали. Вы пробовали код, прежде чем комментировать? 06.01.2016
  • @ erm3nda понятия не имею. это 4 года назад 06.01.2016

  • 2

    Используйте шаблон декоратора.

    // your function definition
    function yourFunction() {}
    
    // decorator
    function callItOnce(fn) {
        var called = false;
        return function() {
            if (!called) {
                called = true;
                return fn();
            }
            return;
        }
    }
    
    yourFunction(); // it runs
    yourFunction(); // it runs    
    yourFunction = callItOnce(yourFunction);
    yourFunction(); // it runs
    yourFunction(); // null
    

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

    var myLibraryFunction = callItOnce(libraryFunction);
    myLibraryFunction(); // it runs
    myLibraryFunction(); // null
    libraryFunction(); // it runs
    
    26.07.2010
  • О нет, я пропустил ваш ответ и добавил ответ, который почти такой же. Я оставлю свой ответ, так как я также показал другой способ. Однако, как это шаблон декоратора? Я думаю, что это больше похоже на аспектно-ориентированное программирование. 29.01.2011
  • @ Хуан, вы оба правы, АОП часто использует шаблон декоратора. 29.01.2011
  • Также называется функциональной композицией ???? 27.07.2019

  • 3

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

    if(!window.mynamespace){
        window.mynamespace={};
    }
    
    mynamespace.callMeOnlyOnce=function(){
    
        if(mynamespace.alreadyCalled)return;
    
        alert('calling for the first time');
        mynamespace.alreadyCalled=true;
    };
    
    // alert box comes
    mynamespace.callMeOnlyOnce();
    
    
    // no alert box
    mynamespace.callMeOnlyOnce();
    
    26.07.2010
  • Значение this относится к объекту Global, а не к самой функции, а allreadyCalled станет свойством объекта Global. Это связано с тем, что функция была вызвана из ссылки, не имеющей базового объекта: callMeOnlyOnce();. Дополнительная информация о this 26.07.2010

  • 4
  • Для тех глобальных переменных-нацистов [поскольку это находится в глобальной области видимости] вы можете использовать blah.call вместо var blah... предполагая, что blah уже определен. Хотя мне этого кода вполне достаточно. 26.07.2010
  • Недостаток этого шаблона в том, что вы должны заключать вызов функции в условный оператор везде, где он вызывается. 26.07.2010
  • @ItzWarty Это недостаточно красиво для меня, как заметил Торок Габор. Есть причина, по которой глобальные сети плохие, поэтому я избегаю их, как чумы, называйте меня глобальным нацистом! Здесь множество других примеров, в которых не используется глобальная переменная и не требуется оборачивать вызов условным оператором везде, где он вызывается. 29.01.2011

  • 5
  • Из всех ответов этот требует наибольшего повторения кода. Каждый вызов должен устанавливать флаг и быть обернут условным оператором. 29.01.2011
  • Это работает, спасибо за ответ. Я застрял более чем на 2 месяца, и вы мне помогли, ваш код работает как шарм. 12.02.2021
  • @Juan Mendes Повторение кода? Это проблема? Создайте функцию-оболочку с именем функции в качестве параметра. Я описал здесь только идею. 13.02.2021
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

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

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..