Javascript 关联数组/对象可以';不能在函数中读取

Javascript 关联数组/对象可以';不能在函数中读取,javascript,scope,global-variables,Javascript,Scope,Global Variables,在javascript文件的开头,我有: var lbp = {}; lbp.defaults = { minLength: 40 }; 我可以通过以下方式成功地在事后发出警报: alert(lbp.defaults.minLength); 但一旦我把它放进一个函数中,当我发出警报时,我就会得到“未定义”。什么给了我,我如何避免这种情况?是否绝对有必要将此变量传递到每个函数中,例如,执行以下操作: function(lbp) { alert(lbp.defaults.minLen

在javascript文件的开头,我有:

var lbp = {};
lbp.defaults = {
    minLength: 40
};
我可以通过以下方式成功地在事后发出警报:

alert(lbp.defaults.minLength);  
但一旦我把它放进一个函数中,当我发出警报时,我就会得到“未定义”。什么给了我,我如何避免这种情况?是否绝对有必要将此变量传递到每个函数中,例如,执行以下操作:

function(lbp) { alert(lbp.defaults.minLength); }
我会想,首先定义它,它将达到全球范围,而不需要传递

提前感谢您的启发:)

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

编辑: 问题似乎是我的初始化函数本身是在lbp中定义的。是否有任何方法可以使用这个函数var,并且仍然在其中使用lbp变量

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>

var lbp={
默认值:{
最小长度:40
}
};
lbp.initialize=函数(){
警报(lbp.defaults.minLength);
};
window.onload=lbp.initialize;

这在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


因此,一些相关的代码似乎有一些问题,但没有显示出来?

这在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


因此,某些关联的代码似乎有一些问题,但没有显示出来?

您是否确实将
lbp
作为参数传递?否则,同名参数将隐藏全局变量。

您是否实际将
lbp
作为参数传递?否则,同名参数将隐藏全局变量。

使用

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

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

window.onload = function() { lbp.initialize(); };
如果调用
initialize
作为
lbp
的一种方法,则
将指向
lbp
。将函数分配给事件处理程序(如
window.onload
)时,实际上是将该函数体复制到定义事件处理程序的对象。所以

window.onload = lbp.initialize

window.onload = function() {
    alert(this.defaults.minLength);  
};
现在,
这个
指向的是
窗口
,这显然不是我们想要的。通过在函数中包装对
lbp.initialize()
的调用,我们可以在该函数中保留该
的上下文,并且可以确保它始终指向
lbp
。查看更完整的解释。

使用

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

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

window.onload = function() { lbp.initialize(); };
如果调用
initialize
作为
lbp
的一种方法,则
将指向
lbp
。将函数分配给事件处理程序(如
window.onload
)时,实际上是将该函数体复制到定义事件处理程序的对象。所以

window.onload = lbp.initialize

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

现在,
这个
指向的是
窗口
,这显然不是我们想要的。通过在函数中包装对
lbp.initialize()
的调用,我们可以在该函数中保留该
的上下文,并且可以确保它始终指向
lbp
。查看更完整的解释。

在您试图在函数中使用lbp的原始代码中。您正在将lbp作为参数传入。这将使用相同名称的局部(到函数)变量从全局范围中隐藏lbp(除非在再次调用传递lbp的函数时)


通过在第一个函数中将lbp作为参数传递,它在函数内部不会被视为全局对象,而是局部参数。

在原始代码中,您试图在函数中使用lbp。您正在将lbp作为参数传入。这将使用相同名称的局部(到函数)变量从全局范围中隐藏lbp(除非在再次调用传递lbp的函数时)



通过在第一个函数中将lbp作为参数传递,它在函数内部不会被视为全局对象,而是局部参数。

如何调用该函数?是否将对象作为参数传递?我在上面添加了完整的脚本代码,我还将添加,将lbp.initialize更改为仅在两个实例中进行初始化解决了问题。这是一个简单的解决方案。我想知道是否还有另一个-但我猜没有。如何调用该函数?是否将对象作为参数传递?我在上面添加了完整的脚本代码,我还将添加,在两个实例中将lbp.initialize更改为仅初始化解决了问题。这是一个简单的解决方案。我想知道是否还有另一个——但我猜没有。好的观点是gnudiff。我在我的问题中添加了一个编辑,因为你已经帮助我进一步定义了这个问题。我在我的问题中添加了一个编辑,因为你帮助我进一步定义了这个问题。仍然没有定义。谢谢,真的吗?如果添加:**window.onload=lbp.initialize;**在你的代码底部,你没有得到一个错误?哇!按您所说的功能添加它很有效。你能给我解释一下背后的逻辑吗?那时你还没有发布完整的代码。我编辑了我的答案以反映这一点。试一试;)还没有定义。谢谢,真的吗?如果添加:**window.onload=lbp.initialize;**在你的代码底部,你没有得到一个错误?哇!按您所说的功能添加它很有效。你能给我解释一下背后的逻辑吗?那时你还没有发布完整的代码。我编辑了我的答案以反映这一点。试一试;)我没有传递函数()的任何内容。你可以在我上面的帖子中看到我的完整代码。如果我要添加函数(lbp),您建议我如何引用它?“this”不起作用…我不会用function()传入任何内容。你可以在我上面的帖子中看到我的完整代码。如果我要添加函数(lbp),您建议我如何引用它?“这个”不起作用。。。