Javascript 为什么两个同名的变量不';在这种情况下不冲突吗?

Javascript 为什么两个同名的变量不';在这种情况下不冲突吗?,javascript,typeahead.js,Javascript,Typeahead.js,我在阅读typeahead.js时发现以下代码: var states = ['Alabama', 'Alaska']; //... more code var states = new Bloodhound({ datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), queryTokenizer: Bloodhound.tokenizers.whitespace, // `states` is an

我在阅读typeahead.js时发现以下代码:

var states = ['Alabama', 'Alaska'];
//... more code
var states = new Bloodhound({
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    // `states` is an array of state names defined in "The Basics"
    local: $.map(states, function(state) { return { value: state }; })
});
我无法理解的是,为什么
Bloodhound
对象使用
states
数组,并且它与
states
变量的后一个声明不冲突

我知道,除非它是。但事实似乎并非如此

我做了自己的实验:

var a = 3;
var a = function(){ alert(a + 2); }
a();
输出:
function(){alert(a+2);}2
,这证明它不应该工作


这是javascript的特性之一吗?

当该语句执行完毕时,将重新分配变量。在该语句中,变量仍有其旧值。这类似于
a=a+1

在变量a被初始化为函数后,尝试访问变量a。 如果你用这样的东西做实验

var a = 10;
var a = {b: a+10}
你会看到a是

{b: 20}

states数组在被覆盖之前被访问。

第一个
状态
将被覆盖,因为它们在同一范围内。我在该页的任何地方都没有看到在同一代码中使用两次变量。请注意,这两个实例在不同的示例中。@Juhana这里的第30行到第61行是我的想法。但是在这种情况下,为什么在我的示例中,
alert
中的
a
不是3?var a=function(){alert(a+2);}在上面的语句中,只声明了函数。未调用。在下一个示例中,当您使用语句a()调用函数时,这一次a已经是一个函数了。这个答案与您对Chuck答案的注释一起解释问题。