Javascript 为什么';t{var foo=foo}抛出引用错误?

Javascript 为什么';t{var foo=foo}抛出引用错误?,javascript,scope,Javascript,Scope,为什么var foo=foo不抛出ReferenceError 注意:foo=foo会抛出一个ReferenceError 当你申报时 var foo = ... 与其他语言相反,您为整个范围(如果不是全局的,则为您的函数)声明变量,而不仅仅是随后的代码 因此,在赋值的右侧部分,foo已经声明,即使它仍然是未定义的。没有引用错误 请注意,javascript中var声明的这个属性可能是错误源。因为您可能有(更复杂的)这种代码: if (true) { var a = 3; // do

为什么
var foo=foo
不抛出
ReferenceError

注意:
foo=foo
会抛出一个
ReferenceError

当你申报时

var foo = ...
与其他语言相反,您为整个范围(如果不是全局的,则为您的函数)声明变量,而不仅仅是随后的代码

因此,在赋值的右侧部分,
foo
已经声明,即使它仍然是
未定义的
。没有引用错误

请注意,javascript中var声明的这个属性可能是错误源。因为您可能有(更复杂的)这种代码:

if (true) {
    var a = 3; // do you think this is "local" ?
}
var a;
alert(a); // a is 3, did you expect it ?

JavaScript将var声明排序到顶部,因此在分配时它已经被声明(即使未定义):


据推测,变量声明是用Javascript发布的。这意味着密码

function bar() {
    // some other code
    var foo = foo;
}
相当于:

function bar() {
    var foo;
    // some other code
    foo = foo;
}
事实上,即使是以下工作:

function bar() {
    return foo;
    var foo;
}

(使用var关键字时返回
未定义的

var foo=foo

JavaScript创建foo,并在代码执行之前为其分配未定义的值。所以你可以给它赋值,这里的值是foo,而foo本身是未定义的,所以事实上你再次通过相同的变量给foo赋值

当你在做

foo=foo

您没有在前面定义左侧foo来为其赋值

当你在做

var foo=bar


您之前没有定义栏。

是的。使用
var
时,虽然初始化未被执行,但声明仍被执行;而使用
函数
时,两个声明都被执行。这会导致类似于
try{throw null;}catch(e){var e=3;}alert(e)
foo=typeof foo
不:)
function bar() {
    return foo;
    var foo;
}