我正在寻找一种好的技巧来摆脱我想要做的事情:设置一个全局变量。
第一次有人通过点击一个按钮来运行一个功能时,它会触发一个初始功能,将一些东西变成可拖动的东西。稍后,如果他们第二次单击该按钮,我想确定init
函数是否已初始化,如果是,则不再调用它。我可以通过从init
函数设置一个全局变量然后从click函数中检查该变量来轻松完成此操作,但我想知道如何在不设置全局变量的情况下执行此操作。我真的想要一个这样做的例子。
答案 0 :(得分:24)
您可以在函数中添加属性:
function init() {
init.called = true;
}
init();
if(init.called) {
//stuff
}
答案 1 :(得分:17)
虽然@Levi的回答应该很好,但我想提出另一个选择。你会过度编写init函数,一旦调用它就什么都不做。
var init = function () {
// do the initializing
init = function() {
return false;
}
};
第一次调用时的函数将执行init。然后它会立即覆盖自己,以便在下次调用时返回false。第二次调用函数时,函数体只包含return false。
更多阅读:http://www.ericfeminella.com/blog/2011/11/19/function-overwriting-in-javascript/
答案 2 :(得分:2)
为什么不检查您的可拖动对象是否有draggable
类?
if ($('.mydiv').is('.draggable')) {
//do something
}
答案 3 :(得分:2)
Function.prototype.fired = false;
function myfunc() {
myfunc.fired = true;
// your stuff
};
console.log(myfunc.fired) // false
myfunc();
console.log(myfunc.fired) // true
答案 4 :(得分:1)
你可以做的是取消原型中的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
将为true并打印exists!
但由于该函数会自行删除,因此第二个if
将失败。在我的例子中,我无条件地调用第二个init只是为了表明什么都不会发生,但当然只有存在才能调用它:
if (o.init) o.init();
答案 5 :(得分:1)
正确的方法是使用JavaScript Proxy API通过apply
处理程序来捕获函数调用。
const initFun = (args) => {
console.log('args', args);
}
const init = new Proxy(initFun, {
apply(target, thisArg, args){
target.calls = target.calls ? target.calls + 1 : 1;
return target.apply(thisArg, args);
}
});
init('hi');
console.log(init.calls); // 1
init('hello');
console.log(init.calls); // 2