Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在函数中向函数对象添加属性有哪些缺陷?_Javascript_Persistence_State - Fatal编程技术网

Javascript 在函数中向函数对象添加属性有哪些缺陷?

Javascript 在函数中向函数对象添加属性有哪些缺陷?,javascript,persistence,state,Javascript,Persistence,State,我发现我可以使用这种技术在事件处理程序中保留某种“状态”,而不必涉及外部变量 我发现这项技术非常巧妙地利用了函数本身实际上是对象这一事实,但我担心我正在做的事情可能会产生某种负面影响 示例… var element = document.getElementById('button'); element.onclick = function funcName() { // attaching properties to the internally named "funcName"

我发现我可以使用这种技术在事件处理程序中保留某种“状态”,而不必涉及外部变量

我发现这项技术非常巧妙地利用了函数本身实际上是对象这一事实,但我担心我正在做的事情可能会产生某种负面影响

示例…

var element = document.getElementById('button');

element.onclick = function funcName() {
    // attaching properties to the internally named "funcName"
    funcName.count = funcName.count || 0;
    funcName.count++;

    if (self.count === 3) {
        // do something every third time
        alert("Third time's the charm!");
        //reset counter
        funcName.count = 0;
    }
};

您可以使用闭包来代替此操作:

element.onclick = (function() {
  var count = 0;
  return function(ev) {
    count++;
    if (count === 3) {
      alert("3");
      count = 0;
    }
  };
})();
该设置涉及代码立即调用的匿名函数。该函数有一个局部变量“count”,它将在连续的事件处理程序调用中保留

顺便说一下,这是:

var something = function dangerous() { ... };

是“危险的”,因为有些浏览器(猜一猜,虽然Safari也有问题)在这样的函数表达式中包含名称时会做一些奇怪的事情

因此,问题是“向函数对象添加属性会有什么陷阱?”感谢您提供了更好的措辞……请记住,变量总是公共的——如果函数可以执行,它的属性也可以访问。我认为IE在清理函数上的那些属性时遇到了问题。我相信jQuery存在一个错误,jQuery在内部创建的处理程序上存储了对绑定元素的引用,当这些元素从DOM中删除时,这导致了IE中的泄漏。但是,如果您只是存储一个数字,即使它有漏洞,也不应该成为问题。非常酷,我更喜欢它,而不是我的
funcName.count=funcName.count | | 0太好了!小心不要在处理程序函数中使用
var
重新声明“count”!