Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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 传递到.on()函数中的变量始终是最后一个元素_Javascript_Jquery - Fatal编程技术网

Javascript 传递到.on()函数中的变量始终是最后一个元素

Javascript 传递到.on()函数中的变量始终是最后一个元素,javascript,jquery,Javascript,Jquery,我在模拟主干网的事件系统,对象如下: var events = { 'click .one': 'fnOne', 'click .two': 'fnTwo', 'click .three': 'fnThree' } 然后,要使用jquery设置事件侦听器,我将使用以下命令: var method, match, event_name, selector; var scope = { // Complex object literal

我在模拟主干网的事件系统,对象如下:

var events = {
    'click .one': 'fnOne',
    'click .two': 'fnTwo',
    'click .three': 'fnThree'
}
然后,要使用jquery设置事件侦听器,我将使用以下命令:

var method,
    match,
    event_name,
    selector;

var scope = {
     // Complex object literal passed to the event's
     // function for access...
};

var delegateEventSplitter = /^(\S+)\s*(.*)$/;
for (key in events) {
    if (events.hasOwnProperty(key)) {
        method = events[key];
        match = key.match(delegateEventSplitter);
        event_name = match[1];
        selector = match[2];

        $('#element').on(event_name,selector,function(event){ 
            method(event,scope);
        });
     }
}

我遇到的问题是,它绑定正确,除了所有事件触发最后一个函数
fntree
只是一个闭包/循环问题。闭包只绑定词法名称,而不绑定当时的值

我最喜欢的获取值的方法之一是使用:

for (key in events) {
    if (events.hasOwnProperty(key)) {
        method = events[key];
        match = key.match(delegateEventSplitter);
        event_name = match[1];
        selector = match[2];

        with ({method:method})
        {
            $('#element').on(event_name,selector,function(event){ 
               method(event,scope);
            });
        }
    }
}
但这会导致Doug Crockford的一些助手死于心脏病发作,所以你也可以这样做:

            (function(method) { $('#element').on(event_name,selector,function(event){ 
               method(event,scope);
            }); })(method);

我会让你决定你觉得哪个更可取。

只是一个闭包/循环问题。闭包只绑定词法名称,而不绑定当时的值

我最喜欢的获取值的方法之一是使用:

for (key in events) {
    if (events.hasOwnProperty(key)) {
        method = events[key];
        match = key.match(delegateEventSplitter);
        event_name = match[1];
        selector = match[2];

        with ({method:method})
        {
            $('#element').on(event_name,selector,function(event){ 
               method(event,scope);
            });
        }
    }
}
但这会导致Doug Crockford的一些助手死于心脏病发作,所以你也可以这样做:

            (function(method) { $('#element').on(event_name,selector,function(event){ 
               method(event,scope);
            }); })(method);
我会让你决定哪一个更可取。

尝试使用
$。each()
。它的函数参数在每次迭代时方便地形成一个闭包

$.each(events, function(key, method) {
    var match = key.match(delegateEventSplitter);
    $('#element').on(match[1], match[2], function(event){ 
        method(event, scope);
    });
});
尝试使用
$.each()
。它的函数参数在每次迭代时方便地形成一个闭包

$.each(events, function(key, method) {
    var match = key.match(delegateEventSplitter);
    $('#element').on(match[1], match[2], function(event){ 
        method(event, scope);
    });
});

+1对于
with()
方法的非常好的用法。。。即使有些人认为它对我不利,也可以用{方法:事件[KEY] } /Cuff>做<代码>,使其更加简洁。与自调用闭包一样,您可以将
事件[key]
作为参数传递。我使用IFFE,不想激怒Crock alytes:-)不想破坏聚会,但即使是Brendan Eich也说
with
是JavaScript中的一个大错误。使用它将在严格模式下抛出错误。因此,不使用它不仅仅是“约定”的问题。当包装在具有未知词汇捕获的任意动态对象上时,使用在
中赋值是一个问题。在
with
上使用对象文字类似于使用ECMAScript Harmony即将推出的
let
+1,以便更好地使用
with()
方法。。。即使有些人认为它对我不利,也可以用{方法:事件[KEY] } /Cuff>做<代码>,使其更加简洁。与自调用闭包一样,您可以将
事件[key]
作为参数传递。我使用IFFE,不想激怒Crock alytes:-)不想破坏聚会,但即使是Brendan Eich也说
with
是JavaScript中的一个大错误。使用它将在严格模式下抛出错误。因此,不使用它不仅仅是“约定”的问题。当包装在具有未知词汇捕获的任意动态对象上时,使用
中赋值是一个问题。在
上使用对象文字与
类似于使用ECMAScript Harmony即将推出的
let