Как определить функцию, вызванную с помощью javascript
У меня есть функция JavaScript.
Как проверить:
-
если функция была вызвана (в разделе <head></head>
есть эта функция), то не вызывать функцию
-
если функция не была вызвана (в разделе <head></head>
этой функции нет), то вызовите функцию
как require_once
или include_once
с PHP
Ответы
Ответ 1
Два варианта:
Статические переменные Здесь, как создавать статические (как в C) переменные, используя функции самозапуска для хранения ваших статических переменных в закрытии.
var myFun = (function() {
var called = false;
return function() {
if (!called) {
console.log("I've been called");
called = true;
}
}
})()
Пустое замещение функции Установите функцию в пустую функцию после ее запуска.
function callonce() {
console.log("I've been called");
arguments.callee = function() {};
}
Абстрактная идея Здесь функция, которая возвращает функцию, которая вызывается только один раз, таким образом нам не нужно беспокоиться о добавлении кодового табличного кода ко всем функциям.
function makeSingleCallFun(fun) {
var called = false;
return function() {
if (!called) {
called = true;
return fun.apply(this, arguments);
}
}
}
// Alternate implementation
function makeSingleCallFun(fun) {
return function() {
return fun.apply(this, arguments);
arguments.callee = function() {};
}
}
var myFun = makeSingleCallFun(function() {
console.log("I've been called");
});
myFun(); // logs I've been called
myFun(); // Does nothing
Ответ 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
Ответ 3
var called = false;
function blah() {
called = true;
}
if ( !called ) {
blah();
}
Ответ 4
Вы можете использовать глобальную переменную в пользовательском пространстве имен, чтобы сохранить, была ли вызвана функция.
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();
Ответ 5
If (!your_func.called) {
your_func.called = true;
your_func();
}