Javascript-变量提升
这是一个简单的片段,我只是不明白的东西 下面的代码输出12,我理解,因为Javascript-变量提升,javascript,Javascript,这是一个简单的片段,我只是不明白的东西 下面的代码输出12,我理解,因为var foo=12替换变量的先前声明 <script> var foo = 1; function bar(){ if (!foo) { var foo = 12; } alert(foo); } bar(); </script> var-foo=1; 功能条(){ 如果(!foo){ var-foo=12; } 警报(foo); } bar(); 在下面的代码中,它警告1
var foo=12代码>替换变量的先前声明
<script>
var foo = 1;
function bar(){
if (!foo) {
var foo = 12;
}
alert(foo);
}
bar();
</script>
var-foo=1;
功能条(){
如果(!foo){
var-foo=12;
}
警报(foo);
}
bar();
在下面的代码中,它警告1,这意味着在函数外部声明的变量可以在函数内部访问
<script>
var foo = 1;
function bar(){
alert(foo);
}
bar();
</script>
var-foo=1;
功能条(){
警报(foo);
}
bar();
但是,在下面的代码中,为什么警告未定义??我想,它会提醒1,我只是将先前声明的变量分配给新变量
<script>
var foo = 1;
function bar(){
if (!foo) {
var foo = foo;
}
alert(foo);
}
bar();
</script>
var-foo=1;
功能条(){
如果(!foo){
var foo=foo;
}
警报(foo);
}
bar();
变量声明被推送到函数的开头
<script>
var foo = 1;
function bar(){
alert(foo);
}
bar();
</script>
因此,在现实中,以下情况正在发生:
function bar(){
var foo;
if (!foo) {
foo = foo;
}
alert(foo);
}
因此,您需要将其更改为使用window.foo
,以便引用全局属性而不是函数的属性:
var foo = 1;
function bar(){
var foo;
if (!window.foo) {
foo = window.foo;
}
alert(foo);
}
bar();
吊装有点棘手。函数声明与函数赋值一起提升,但是变量声明在没有变量赋值的情况下提升。所以代码的执行顺序实际上是:
var foo;
var bar = function bar(){
var foo; // undefined
if (!foo) { // true
foo = foo; // foo = undefined
}
alert(foo);
}
foo = 1;
bar();
如果要引用全局变量foo
,可以使用window.foo
,或者使用其他变量名:
var foo = 1;
function bar(){
var baz = foo;
alert(baz);
}
bar();
下面的代码输出12,我理解,因为var foo=
12; 替换先前的变量声明
<script>
var foo = 1;
function bar(){
if (!foo) {
var foo = 12;
}
alert(foo);
}
bar();
</script>
你是对的,因为局部变量覆盖了全局变量
在下面的代码中,它向1发出警报,即声明的变量
函数外部可在函数内部访问
<script>
var foo = 1;
function bar(){
alert(foo);
}
bar();
</script>
你说得对foo
在全局范围内声明,因此可以从任何位置访问
但是,在下面的代码中,为什么警告未定义??我想会的
警报1,我只是将先前声明的变量赋值给
新的
这有点不同。您正在用相同的名称声明一个全局变量和一个局部变量。当JavaScript程序执行进入一个新函数时,函数中任何位置声明的所有变量都会移动(或提升或提升)到函数的顶部
<script>
var foo = 1;
function bar(){
alert(foo);
}
bar();
</script>
另一个例子:
var a=123;
函数f(){
var a;//与:var a=未定义相同;
警报(a);//未定义
a=1;
警告(a);//1
}
f()代码>IMHO它与函数声明和提升无关
在函数内部用var
声明变量在函数的隔离作用域中创建变量时,这就是未定义变量的原因
var foo = 1;
function funcOne() {
var foo = foo;
alert('foo is ' + foo);
};
funcOne();
var bau = 1;
function funcTwo() {
bau = bau;
alert('bau is ' + bau);
};
funcTwo();
在javascript中,在ES5规范之前,范围仅在函数体中实现。块作用域的概念不存在()
所以,如果你声明一个变量var某物代码>从函数体外部,它将是全局的(在浏览器中,全局范围是窗口对象的范围)
全局变量
var something='Hi-Man';
/**
*这等于:
**/
window.something='Hi-Man'代码>使用var foo=window.foo代码>如果(!foo){
检查全局变量foo
,但在if
语句中,您正试图用另一个foo
更改此全局变量值,而在if
语句中,则未定义,函数表达式也会发生同样的情况。明白了:)学到了一些新的东西(thanx:)这是一个很好的例子,thanx:)