Javascript 变量未定义/超出范围

Javascript 变量未定义/超出范围,javascript,Javascript,这是一个范围问题,对吗 编辑: 在下面函数的第38行,displayBossMessage()是自己调用的,变量“boss”似乎超出了范围。它应该包含当前boss的名称(字符串),并且在调用函数时,应该将其放回“boss”参数中 但老板似乎总是不明确。在创建jQuery侦听器之前,我尝试创建一个变量,以查看它是否在范围内,但似乎不在范围内 或者也许我今天过得很慢;p function displayBossMessage(boss,message,options,timer){ boss

这是一个范围问题,对吗

编辑:

在下面函数的第38行,displayBossMessage()是自己调用的,变量“boss”似乎超出了范围。它应该包含当前boss的名称(字符串),并且在调用函数时,应该将其放回“boss”参数中

但老板似乎总是不明确。在创建jQuery侦听器之前,我尝试创建一个变量,以查看它是否在范围内,但似乎不在范围内

或者也许我今天过得很慢;p

function displayBossMessage(boss,message,options,timer){
    boss = bosses[boss];

    //clear any possible lingering text/buttons
    $(boss.messagebox).text('');
    $(boss.optionsbox).text('');
    displayMessage_CurrentBoss = boss;

    //if no options provided, set a default "continue" button
    if(options == ''){
        options = {
            'default' : {
                'text' : 'Continue',
                'func' : function(){}
            }
        }
    }

    $('#container div').hide();
    $(boss.div).fadeIn(1500);

    writeMessage(message,$(boss.messagebox),0);

    setTimeout(function(){
        $(boss.optionsbox).fadeIn(1000);
    },3000);

    //"listen" for a choice
    var i = 0;
    for(option in options){
        $(boss.optionsbox).html($(boss.optionsbox).html() + '<button name="'+ i +'">'+ options[option].text +'</button> &nbsp;');

        $(document).on('click', (boss.div)+' button[name="'+i+'"]', function(){
            options[option].func();

            //close message screen or show defined response
            if(typeof options[option].response != 'undefined'){
                displayBossMessage(boss,options[option].response,'',true);
            }else{
                $(boss.div).hide();
                $('#container div').fadeIn(1500);
            }

        });
    }

    if(timer){
        //if they are afk/don't click after a minute, do it for them
        setTimeout(function(){
            $(boss.div+' button[name="0"]').click();
        },60000);
    }
}
功能显示boss消息(boss、消息、选项、计时器){
老板=老板[老板];
//清除任何可能的延迟文本/按钮
$(boss.messagebox).text(“”);
$(boss.optionsbox).text(“”);
显示消息\u CurrentBoss=boss;
//如果未提供选项,请设置默认的“继续”按钮
如果(选项=“”){
选项={
“默认值”:{
“文本”:“继续”,
“func”:函数(){}
}
}
}
$('#container div').hide();
美元(boss.div).fadeIn(1500);
writeMessage(message,$(boss.messagebox),0);
setTimeout(函数(){
$(boss.optionsbox).fadeIn(1000);
},3000);
//“倾听”选择
var i=0;
用于(选项中的选项){
$(boss.optionsbox).html($(boss.optionsbox.html()++''+options[option].text++'');
$(document).on('click',(boss.div)+'按钮[name=“'+i+']”,function(){
选项[option].func();
//关闭消息屏幕或显示定义的响应
如果(选项类型[option].response!=“未定义”){
显示boss消息(boss,选项[option]。响应,',真);
}否则{
$(boss.div).hide();
美元("货柜部").法代因(1500);;
}
});
}
中频(定时器){
//如果他们是afk/一分钟后不点击,为他们做这件事
setTimeout(函数(){
$(boss.div+'按钮[name=“0”]”)。单击();
},60000);
}
}
希望我没有完全忘记和错过这么简单的事情

*编辑:BOSS变量(是全局变量)*

(更新了到#11的JSFIDLE修订链接,其中包括两种解决方案)

看起来这可能是一把工作小提琴:

一个小问题:第30行有一个额外的
调用(第二个)
警报
调用-字符串文本没有正确关闭(或者说打开了另一个)。之后,我能够调查并得出以下结论(2个问题)


第一个问题是变量覆盖这里:

function displayBossMessage(boss,message,options,timer){
    boss = bosses[boss]; // this line, boss was a string, now it will be an object
以及后面在同一函数中的用法:

if(typeof options[option].response != 'undefined'){
    displayBossMessage(boss,options[option].response,'',true); // first arg is now an object
解决方案是创建对原始
boss
的引用,该引用是一个字符串,如:

function displayBossMessage(boss,message,options,timer){
    var origBoss = boss; // let's remember what it was in its original string form
    boss = bosses[boss];
并像这样使用它:

if(typeof options[option].response != 'undefined'){
    displayBossMessage(origBoss,options[option].response,'',true); // now we're dealing with a string ref

第二个问题是
for
循环中对
选项的引用。它总是引用自
$(文档)以来的最后一个值。on('click')…
总是延迟(异步)。有很多方法可以解决这个问题。我选择使用
bind
,并为每个特定迭代传入一个参数,该参数引用
选项
的值

请注意,在原始的
选项中,
位于异步函数中,但不在闭包中(
for
不是闭包):

因此,在click处理程序的回调函数中引入一个名为
option
的参数:

$(document).on('click', (boss.div)+' button[name="'+i+'"]', function(option){ // here
    options[option].func(); // and now option is whatever the argument value is
不要忘记通过bind将其传递到函数声明中:

    $(document).on('click', (boss.div)+' button[name="'+i+'"]', function(option){
        options[option].func();
        // ...
    }.bind(this,option)); // here we're passing whatever option is for the specific iteration as the first argument of the callback function
注意,
这个
只是作用域,第一个之后的每个后续参数都对应于函数定义中的参数。

(更新了到#11的JSFIDLE revision链接,其中包括两种解决方案)

看起来这可能是一把工作小提琴:

一个小问题:您在第30行有一个额外的
调用(第二个)
警报
调用-字符串文本没有正确关闭(或者更确切地说是打开了另一个)。之后,我能够调查并得出以下结论(2个问题)


第一个问题是变量覆盖这里:

function displayBossMessage(boss,message,options,timer){
    boss = bosses[boss]; // this line, boss was a string, now it will be an object
以及后面在同一函数中的用法:

if(typeof options[option].response != 'undefined'){
    displayBossMessage(boss,options[option].response,'',true); // first arg is now an object
解决方案是创建对原始
boss
的引用,该引用是一个字符串,如:

function displayBossMessage(boss,message,options,timer){
    var origBoss = boss; // let's remember what it was in its original string form
    boss = bosses[boss];
并像这样使用它:

if(typeof options[option].response != 'undefined'){
    displayBossMessage(origBoss,options[option].response,'',true); // now we're dealing with a string ref

第二个问题是对
for
循环中
选项的引用。它总是引用自
$(文档)以来的最后一个值。on('click')…
总是延迟(异步)。有很多方法可以解决这个问题。我选择使用
bind
并为每个特定迭代传入一个参数,该参数引用
选项的值

请注意,在原始的
选项中,
位于异步函数中,但不在闭包中(
for
不是闭包):

因此,在click处理程序的回调函数中引入一个名为
option
的参数:

$(document).on('click', (boss.div)+' button[name="'+i+'"]', function(option){ // here
    options[option].func(); // and now option is whatever the argument value is
不要忘记通过bind将其传递到函数声明中:

    $(document).on('click', (boss.div)+' button[name="'+i+'"]', function(option){
        options[option].func();
        // ...
    }.bind(this,option)); // here we're passing whatever option is for the specific iteration as the first argument of the callback function

注意,
这个
只是作用域,第一个之后的每个后续参数都对应于函数定义中的参数。

这里的基本问题是在循环中错误使用闭包变量
-全局声明数组?相关?有一个可以在浏览器中打开的工作示例,比如jsfiddle.net示例吗?@Mike'Pomax'Kamermans当然,我现在就做一个基本问题这里的基本问题是循环中闭包变量的错误使用什么是
boss[]
-全局声明数组?相关?有一个可以在浏览器中打开的工作示例,比如jsfiddle.net示例吗?@Mike'Pomax'Kamermans当然,我现在就做一个!谢谢。我真是个白痴