javascript - 预解析和作用域问题
ringa_lee
ringa_lee 2017-04-11 11:58:50
[JavaScript讨论组]
  // 考题二,考变量提升和没有块级作用域:
    console.log(a);
    if ('a' in window) {
        var a = 10;
    }
    console.log(a);


    // 考题三,考函数作用域:
    if ('a' in window) {
        (function(){
            var a = 10;
        }());
    }
    console.log(a);

搞不懂'a' in window为什么是true;

ringa_lee
ringa_lee

ringa_lee

全部回复(3)
天蓬老师

1、先说考题2,在javascript中是没有块级作用于的,也就是说,题中的代码等同于一下代码:

    console.log(a);
    var a;
    if ('a' in window) {
        a = 10;
    }
    console.log(a);
另外,使用var声明的变量和使用function声明的函数在执行之前会被前置,所以题中代码等同于一下代码:
    var a;
    console.log(a);
    if ('a' in window) {
        a = 10;
    }
    console.log(a);
而var a;声明变量可以认为相当于在window上注册了a变量:window.a。所以就这样了

2、考题3是吧var a = 10 ;放到了一个闭包里面:

         (function(){
            var a = 10;
        }());
这是一个函数,javascript中是有函数作用域的,所以a的声明是无法提出来到外面的,在外面也无法引用到a,所以执行结果会报错。
迷茫

JavaScript的变量作用域里有一条规则“全局变量都是window对象的属性”

a用过之后就是window对象一个属性了;

PHP中文网

首先明白两点:

  • 变量声明会提升,即使是在if语句内

  • 全局变量都是window对象的属性

所以第一个问题

console.log(a);
    if ('a' in window) {
        var a = 10;
    }
    console.log(a);
    
代码相当于

window.a = undefined;
console.log(a); //undefined
if ('a' in window) {
    var a = 10;
}
console.log(a); //10

第二个问题,a在函数作用域内声明,不会成为全局变量

if ('a' in window) {
    (function(){
        var a = undefined;
        a = 10;
    }());
}
console.log(a); //error,a is not defined
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号