Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.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 - Fatal编程技术网

Javascript 如何在函数中包装函数以避免代码重复

Javascript 如何在函数中包装函数以避免代码重复,javascript,Javascript,在本例中使用jQuery,但这与答案无关 我有两个事件在页面加载时触发: triggerEvent(SNVisitsForm); $('#email').blur(triggerEvent(SNEnterEmail)); 第一个是当用户访问页面时触发的,另一个是当用户模糊电子邮件字段时触发的侦听器 triggerEvent是一个函数,我使用它用一个简单的条件“包装”许多不同的函数。目标是使此条件函数能够包装任意函数: function triggerEvent(wrapped_functio

在本例中使用jQuery,但这与答案无关

我有两个事件在页面加载时触发:

triggerEvent(SNVisitsForm); 
$('#email').blur(triggerEvent(SNEnterEmail));
第一个是当用户访问页面时触发的,另一个是当用户模糊电子邮件字段时触发的侦听器

triggerEvent
是一个函数,我使用它用一个简单的条件“包装”许多不同的函数。目标是使此条件函数能够包装任意函数:

function triggerEvent(wrapped_function) {
if (typeof _cookie !== 'undefined') {
        wrapped_function();
        console.log('Doing the event, because the cookie is defined');
    }
}
该函数对于两个示例中的第一个示例(即,(
triggerEvent(SNVisitsForm);
函数完美地工作)

但是,由于
sninteremail
是这样开始的:

function SNEnterEmail(event) {
    var email = event.target.value;
我需要通过包装函数将事件传递给包装函数

有没有更“javascript”的方法来做到这一点?答案肯定不是“只是将条件代码放在每个需要它的调用周围”或“将它放在每个需要它的函数中”。javascript批准的避免重复的方法是什么

编辑:我应该补充一点,答案可能与将函数包装成函数完全不同。这是我所能想到的最好的方式来说明我正在尝试做什么

被接受的答案如何为我解决这个问题:

我确实使用了adrian的包装函数,然后对我的调用进行了快速修改,使一切正常:

if (window.location.pathname == '/') {
    (triggerEvent(SNVisitsForm)()); 
}
$('#email').blur(triggerEvent(SNEnterEmail));

我不确定adrian为什么将包装函数更改为VAR,我将它们保留为函数。然后我简单地对包装函数(即未绑定到侦听器的函数)进行“标准”调用,并立即调用函数表达式。

只需创建一个返回函数的函数装饰器。其余部分由闭包处理

function triggerEventWrapper(wrapped_function) {
 return function(){
   if (typeof _cookie !== 'undefined') { 
      console.log('Doing the event, because the cookie is defined');
      return wrapped_function.apply(this,arguments);
     }
 }
}


var SNEnterEmail = triggerEventWrapper(function(){
   ...... the function decloration
});
$('#email').blur(SNEnterEmail);


var  SNVisitsFormWrapped = triggerEventWrapper(SNVisitsForm); 
SNVisitsFormWrapped();

你认为,
$('#email').blur(triggerEvent(sninteremail));
有什么作用?(要特别明确和准确)@Amit:我认为该行将侦听器绑定到
#email
所选元素的模糊事件。当该元素发生模糊事件时,将使用参数
snentremail
调用名为
triggerEvent
的函数。然后该函数将检查一个条件,此时条件是否为truede>SNINTEREMAIL将被调用。再说一次,用不太专业的术语来说,当用户单击“电子邮件”字段时,我将确保启用cookie,然后执行关联事件(如果启用)。好吧,正如我所怀疑的那样……你把那部分搞错了……这一行的作用是(按顺序…):1.调用
triggerEvent
,将
sninteremail
作为参数传递。2.尝试将作为函数返回的调用绑定到blur事件,但没有显式返回,这使得它
未定义
,这意味着没有任何东西真正绑定到blur,但这并不重要。@Amit感谢您将其清除。Wi在这种理解和阿德里安的回答下,我能够得到一个有效的解决方案。@fildred13对不起,我的错误您可以使用
if(window.location.pathname=='/'&&typeof'u cookie!==='undefined')SNVisitsForm()
…或者您可以检查函数本身内部的条件。包装一个函数并立即调用它而不带参数似乎很奇怪。关闭,但没有雪茄。第一行(
triggerEvent(SNVisitsForm);
)不起作用我添加了用法。这应该会有帮助。不……不会。你没有注意这个问题&我的评论请查看问题的编辑,以了解我是如何使用此答案的。