2

如果我在回调函数中有一个回调函数,我将无法访问在第一个回调中声明的变量。

请参阅示例(使用一些 jquery):

我的小提琴

为什么是这样?

或者

我究竟做错了什么!?

我在以下情况下使用它:

$('<div/>').html(data).find('load').each(function(id, deze) {

        var method = $(deze).attr("method");
        var animate = $(deze).attr("animate");
        var locatie = $(deze).attr("id");
        var html = $(deze).html();

        if(!method){
            method = 'overide';
        }

        if(!locatie){
            error('A002','No loadloc');
        }

        if(!html){
            html = '';
        }

        if(!animate){
            animate = false;
        }
        else if(animate == 'fade'){
            var effectout = 'fade';
            var timeout = 100;
            var optionsout = {
                easing: 'swing'
            };

            var effectin = 'fade';
            var timein = 600;
            var optionsin = {
                easing: 'swing'
            };
        }
        else{
            animate = false;
            error('A006','Animation: "' + animate + '" does not exist');
        }

            //here I make callback or direct function call
        if(animate){
            $('#' + locatie).hide(effectout, optionsout, timeout, load());
        }
        else{
            load();
        }

    function load(){
        console.log('hallo');
        console.log(html);
        if(method == 'overide'){
            $('#' + locatie).html(html);
        }
        else if(method == 'tablerow'){
            var html = $('tr', deze).html();
            $('#' + locatie).html(html);
        }
        else if(method == 'append'){
            $('#' + locatie).append(html);
        }
        else if(method == 'prepend'){
            $('#' + locatie).prepend(html);
        }
        else{
            error('A007','load method: "' + method + '" does not exist');
        }

        if(animate){
            $('#' + locatie).show(effectin, optionsin, timein);
        }
    }

    });
4

3 回答 3

3

为什么是这样?

它不是。您可以简单地访问something,它在load您发布的功能范围内。

我究竟做错了什么!?

您没有将load函数本身作为回调传递,但它是结果 - 您立即调用它(不带参数)。你要

$('#' + locatie).hide(effectout, optionsout, timeout, load);
//                                                        ^^
//It seems I can't reach html and other variables here
console.log(this.html);

这不是一个变量,这是一个属性this(并且this关键字在不同的调用中指向不同的东西)。你想要的是一个简单的变量:

console.log(html);

和其他人的故事相同this.locatie

于 2013-08-06T16:24:00.613 回答
1

我稍微更改了您的代码,我相信这就是您想要做的:

http://jsfiddle.net/smerny/2M6k3/

var anothercallbackfunctiontriggerthing = function(cb) {
    cb();
}

$('.something').each(function(id, value) {
        var something = 'something';
        var load = function(){
                    // can't reach something here
                    console.log(something);
        }
        anothercallbackfunctiontriggerthing(load);
});

由于load()没有返回任何内容,我假设您想将它作为回调 ( load) 传递,然后从内部调用它anothercallbackfunctiontriggerthing。上面的代码将为每个.something.

于 2013-08-06T16:24:14.613 回答
0

它不起作用的原因是因为关键字this在上下文中改变了含义,load()因为您使用function load(). 有几种方法可以解决这个问题;这是一个:

前:

if(animate){
            $('#' + locatie).hide(effectout, optionsout, timeout, load());
        }
        else{
            load();
        }

利用

var load = (function(el) {
    return function() {
        console.log('hallo');
                //It seems I can't reach html and other variables here
        console.log(el.html);
        if(method == 'overide'){
            $('#' + el.locatie).html(el.html);
        }
        else if(method == 'tablerow'){
            var html = $('tr', deze).html();
            $('#' + el.locatie).html(el.html);
        }
        else if(method == 'append'){
            $('#' + el.locatie).append(el.html);
        }
        else if(method == 'prepend'){
            $('#' + el.locatie).prepend(el.html);
        }
        else{
            error('A007','load method: "' + el.method + '" does not exist');
        }

        if(el.animate){
            $('#' + el.locatie).show(el.effectin, el.optionsin, el.timein);
        }
    };
})(this);

我在那里所做的是将所有引用更改为thiswith el。然后我this使用el以下格式注入:

load = ( function(el) {  return yourFunction() {...}; })(this);

让我知道这是否有意义以及它是否适合您:)

于 2013-08-06T16:44:29.907 回答