我的代码中的Var不起作用

时间:2015-06-23 16:03:24

标签: javascript jquery

"无功"在我的代码中没有用。 它始终显示'hasclass = 0 and body has class',但应hasclass = yes and body has class

setInterval(function() {
if($('.webMessengerMessageGroup').length>0) {
    if(hasclass === 'dooainn') {
        console.log('hasclass = yes and body has class');
    } else {
        var hasclass = 'dooainn';
        console.log('hasclass = 0 and body has class'); 
        $('._38 p').click(function () {
            var message_text = $(this).text();
            console.log(message_text);
        });
    }
} else {
    console.log('body has not class');
} 
},2000);

3 个答案:

答案 0 :(得分:2)

var hasclass未在if的范围内定义。如果你将var移到函数之外,它应该可以工作。

var hasclass = '';
setInterval(function() {
if($('.webMessengerMessageGroup').length>0) {
    if(hasclass === 'dooainn') {
        console.log('hasclass = yes and body has class');
    } else {
        hasclass = 'dooainn';
        console.log('hasclass = 0 and body has class'); 
        $('._38 p').click(function () {
            var message_text = $(this).text();
            console.log(message_text);
        });
    }
} else {
    console.log('body has not class');
} 
},2000);

答案 1 :(得分:1)

您可能听说过var已被提升,并且#34;所以你期待你的整个

var hasclass = 'dooainn';

行向上移动到函数的顶部。但这不是它的工作原理。只有var hasclass部分被悬挂。 hasclass = 'dooainn';部分仍然存在。

所以你的代码真正做的是:

setInterval(function() {
    var hasclass = undefined;                                // <==
    if($('.webMessengerMessageGroup').length>0) {
        if(hasclass === 'dooainn') {
            console.log('hasclass = yes and body has class');
        } else {
            hasclass = 'dooainn';                            // <==
            console.log('hasclass = 0 and body has class'); 
            $('._38 p').click(function () {
                var message_text = $(this).text();
                console.log(message_text);
            });
        }
    } else {
        console.log('body has not class');
    } 
},2000);

所以hasclass永远不会是=== "dooainn"

更多(在我的博客上)Poor, misunderstood var

您可能打算在回调中声明 ,以便在调用之间保持该值:

var hasclass;                                               // <==
setInterval(function() {
    if($('.webMessengerMessageGroup').length>0) {
        if(hasclass === 'dooainn') {
            console.log('hasclass = yes and body has class');
        } else {
            hasclass = 'dooainn';                            // <==
            console.log('hasclass = 0 and body has class'); 
            $('._38 p').click(function () {
                var message_text = $(this).text();
                console.log(message_text);
            });
        }
    } else {
        console.log('body has not class');
    } 
},2000);

现在,在第二次调用之后,它可能具有该值,因为您可能已经在之前的迭代中分配了它。

答案 2 :(得分:0)

其他答案是正确的,您的问题是 var 声明的范围仅限于“else”语句。但是,我想我会为你提供一个替代方案,以便你的setInterval不会继续永远运行。如果上次检查失败,此代码仅在等待2秒后重新执行webMessengerMessageGroup检查。

var addClickFunc = function(){    
    if($('.webMessengerMessageGroup').length>0) {
        $('._38 p').click(function () {
            var message_text = $(this).text();
            console.log(message_text);
        });
    } else {
        setTimeout(addClickFunc,2000);
    }    
};

setTimeout(addClickFunc,2000);

除了必须检查选择器是否存在之外的另一种选择是使用委托,可以随时设置。

$(document).on('click', '._38 p',function () {
    var message_text = $(this).text();
    console.log(message_text);
});