如何在不设置全局变量的情况下确定是否调用了函数

时间:2012-07-02 19:27:34

标签: javascript jquery

我正在寻找一种好的技巧来摆脱我想要做的事情:设置一个全局变量。

第一次有人通过点击一个按钮来运行一个功能时,它会触发一个初始功能,将一些东西变成可拖动的东西。稍后,如果他们第二次单击该按钮,我想确定init函数是否已初始化,如果是,则不再调用它。我可以通过从init函数设置一个全局变量然后从click函数中检查该变量来轻松完成此操作,但我想知道如何在不设置全局变量的情况下执行此操作。我真的想要一个这样做的例子。

6 个答案:

答案 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();

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

答案 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