无法在函数中读取关联数组/对象

时间:2010-05-07 07:48:19

标签: javascript scope global-variables

在javascript文件的最开头,我有:

var lbp = {};
lbp.defaults = {
    minLength: 40
};

之后我可以成功提醒它:

alert(lbp.defaults.minLength);  

但是当我把它放在一个函数中时,当我发出警报时,我会得到“Undefined”。什么给出了,我该如何避免这种情况?是否绝对有必要将此变量传递给每个函数,例如,执行:

function(lbp) { alert(lbp.defaults.minLength); }

我本以为首先定义它,它会达到全球范围而不是被要求传递?

提前感谢您启发我:)

====================================

编辑: 问题似乎可能是我的初始化函数本身是在lbp中定义的。有没有办法使用这个函数var,还是在里面使用lbp vars?

lbp.initialize = function() {
        alert(lbp.defaults.minLength);  
};

完整的代码如下所示:

<script type="text/javascript">

var lbp = {
    defaults: {
        minLength: 40
    }
};

lbp.initialize = function() {
    alert(lbp.defaults.minLength);  
};
    window.onload = lbp.initialize;
</script>

4 个答案:

答案 0 :(得分:3)

你实际上是以lbp作为参数吗?否则,具有相同名称的参数将隐藏全局变量。

答案 1 :(得分:2)

使用this

var lbp = {
    defaults: {
        minLength: 40
    }
};

lbp.initialize = function() {
    alert(this.defaults.minLength);  
};

window.onload = function() { lbp.initialize(); };

如果您将initialize称为lbp方法,this将指向lbp。将函数分配给事件处理程序(例如window.onload)时,实质上是将该函数的主体复制到定义了事件处理程序的对象。所以,

window.onload = lbp.initialize

相同
window.onload = function() {
    alert(this.defaults.minLength);  
};

现在,this指向window,这显然不是我们想要的。通过在函数中包含对lbp.initialize()的调用,我们在该函数中保留this的上下文,并确保它始终指向lbp。请查看this以获取更完整的说明。

答案 2 :(得分:1)

这适用于我在Firefox中的javascript控制台:

javascript:var lbp={}; lbp.defaults={minLength: 40};function xx() { alert(lbp);alert(lbp.defaults);alert(lbp.defaults.minLength); }; xx();

输出[object Object],[object Object],40。

所以,似乎某些相关代码可能存在一些问题,但未显示?

答案 3 :(得分:0)

在您尝试在函数中使用lbp的原始代码中。你正在传递lbp作为参数。这将使用同名的本地(函数)变量将lbp隐藏在全局作用域中(除非在调用函数时再次传入lbp)。

//this is what you have and will not alert a thing other
//and will probably throw an error
function(lbp) { alert(lbp.defaults.minLength; }
//should just be this with no argument. this will allow
//the function to see lbp in the global scope.
function() {  alert(lbp.defaults.minLength; }

通过将lbp作为参数传递给第一个函数,它在函数内部看不到全局对象,而是局部参数。