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;
}