首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >javascript变量未定义

javascript变量未定义
EN

Stack Overflow用户
提问于 2012-08-15 10:08:21
回答 4查看 29.3K关注 0票数 10

首先,让我们看看代码。

代码语言:javascript
运行
复制
var a=0;
b=1;
document.write(a);
function run(){
    document.write(b);
    var b=1;
}
run();

我认为结果是01,.but,实际上,结果是0undefined

然后我修改了这段代码。

代码语言:javascript
运行
复制
var a=0;
b=1;
document.write(a);
function run(){
    document.write(this.b); //or document.write(window.b)
    var b=1;
}
run();

是的,这一次它像预期的那样运行。01。我不明白,为什么?

更有趣的是,我再次修改了代码。

代码语言:javascript
运行
复制
var a=0;
b=1;
document.write(a);
function run(){
    document.write(b);
    //var b=1;       //I comment this line
}
run();

结果是01。

那么,有没有人能解释一下?

感谢分享你的观点。我简化了这段代码

代码语言:javascript
运行
复制
b=1;
function run(){
    console.log(b); //1
}

二:

代码语言:javascript
运行
复制
b=1;
function run(){
    var b=2;
    console.log(b); //2
}

三:

代码语言:javascript
运行
复制
b=1;
function run(){
    console.log(b); //undefined
    var b=2;
}
EN

Stack Overflow用户

回答已采纳

发布于 2012-08-15 10:30:34

当您在函数中引用变量时,JS首先检查该变量是否在当前作用域中声明,即在该函数中声明。如果未找到,则在包含范围内查找。如果仍未找到,它将在下一个作用域中向上查找,依此类推,直到最终到达全局作用域。(请记住,您可以将函数相互嵌套,这就是如何获得多个级别的包含作用域的方法,当然您的示例不会这样做。)

声明:

代码语言:javascript
运行
复制
b=1;

如果不使用var,则会声明一个全局变量,该变量可在任何函数中访问,除非在第一个函数中还声明了一个局部b。这称为variable shadowing

“但是”,您会说,“我在document.write(b)之后声明本地b”。在这里,你遇到了声明“提升”。JS解释器将函数中任何位置声明的变量视为在函数顶部声明的变量(即,它被“提升”到顶部),但是,任何赋值都会在适当的位置发生。所以你的第一个函数实际上是这样执行的:

代码语言:javascript
运行
复制
function run(){
    var b;              // defaults to undefined
    document.write(b);  // write value of local b
    b=1;                // set value of local b
}

在使用this.b的第二个函数中,您会发现this引用了window,而全局变量本质上是window的属性。因此,您正在访问全局b,而忽略了本地are。

在您的第三个函数中,您根本没有声明一个本地b,所以它引用了全局all。

票数 17
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11963240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档