每日一学(一)

简介:     以下两段代码各自的输出结果是什么,为什么。      //1. var a="window"; function Test(){ console.

    以下两段代码各自的输出结果是什么,为什么。

    

    //1.
    var a="window";
    function Test(){
        console.log(a);
        var a="local";
        console.log(a);
    }
    Test();
    
    //2.
    var pengpeng="This is his code!";
    pengpeng.love="study";
    console.log(pengpeng);
    console.log(pengpeng.love); 

    

    先说第一个,最后的输出结果首先输出undefined,然后输出local。有些神奇有木有,仔细梳理就会发现端倪了,代码首先定义了一个全局对象a,因此按理说执行Test第一行代码的时候,a此时应该会使用全局对象a的,往下的时候,局部a会覆盖全局a,然后接着输出local,但实际结果第一个却是undefined。

    关于这点,不得不提JS的加载逻辑了,很多人会觉得JS变量的定义和声明,是在JS运行期间进行的,其实不是,JS有个预加载逻辑,会事先构造运行环境以及作用域,那么答案就呼之欲出了,上面第一段代码,JS预加载的时候,局部变量a覆盖了全局变量a,那么既然是局部已经优先覆盖了全局a,为什么第一个a还是undefined呢? 这就不得不提作用域了,预加载的时候,全局a的作用域已经变成了局部a,所以一个输出的时候,根据作用域找a的时候,其实是找不到这个a的,此时的a,仅仅只是被定义过,但是它的作用链上,是指向下面的a的,下面的a在运行到那里的时候才会被赋值,而此时a相当于未赋值,所以输出undefined,如果不是全局定义了一下a,第一次输出a会报未定义。

    总结一下第一个案例的原理,JS预加载的时候,局部变量改变了全局变量的作用域,在局部变量之前访问全局变量时,此时值是undefined。

    


      再说第二个,这个不细心一下会被“障眼法”遮住,为啥给赋值了,第二个居然仍然输出undefined?? ——答案是,变量pengpeng只是一个值类型对象,而非引用类型对象,值类型是没有属性的, 只有引用类型才有。so,penglong.love肯定会输出undefined了。

    如果要用属性,得这么用:

    

    //3.
    var dingman=new Object();
    dingman.love="study";
    console.log(dingman.love);

    

    以上知识点出处:https://www.cnblogs.com/sharpxiajun/p/4133462.html

目录
相关文章
|
4月前
|
XML Java 数据格式
🚀今天,我们来详细的聊一聊SpringBoot自动配置原理,学了这么久,你学废了吗?
🚀今天,我们来详细的聊一聊SpringBoot自动配置原理,学了这么久,你学废了吗?
99 0
|
11月前
|
存储 算法 数据安全/隐私保护
【强烈推荐收藏】坚持3个月爆肝华为机试108题C++全解(适合新手入门,就业必刷套题)
【强烈推荐收藏】坚持3个月爆肝华为机试108题C++全解(适合新手入门,就业必刷套题)
204 2
|
存储 程序员 数据安全/隐私保护
|
JavaScript 前端开发 Python
带你读书之“红宝书”:第三章 语法基础(上)
带你读书之“红宝书”:第三章 语法基础(上)
69 0
带你读书之“红宝书”:第三章 语法基础(上)
|
缓存 Java Maven
spring中那些让你爱不释手的代码技巧(续集下)
spring中那些让你爱不释手的代码技巧(续集下)
spring中那些让你爱不释手的代码技巧(续集下)
|
监控 前端开发 Java
外行人都能看懂的WebFlux,错过了血亏(二)
这篇文章主要讲解什么是WebFlux,带领大家入个门,希望对大家有所帮助(至少看完这篇文章,知道WebFlux是干嘛用的)
1060 2
外行人都能看懂的WebFlux,错过了血亏(二)
外行人都能看懂的WebFlux,错过了血亏(一)
这篇文章主要讲解什么是WebFlux,带领大家入个门,希望对大家有所帮助(至少看完这篇文章,知道WebFlux是干嘛用的)
4043 0
外行人都能看懂的WebFlux,错过了血亏(一)
|
存储 缓存 JavaScript
想好怎么学 Servlet规范了嘛?想好了嘛?没想好先看看这篇文章(爆肝之作),先看着然后慢慢想!!
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。 狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
想好怎么学 Servlet规范了嘛?想好了嘛?没想好先看看这篇文章(爆肝之作),先看着然后慢慢想!!
|
XML Java 应用服务中间件
【Servlet入门】一篇文章让你从没听过到了熟于心
上一篇我们学习了Java Web中的XML部分了,如果你对XML一无所知,那你可以去看看这一篇文章,它可以使你快速入门XML。
【Servlet入门】一篇文章让你从没听过到了熟于心
|
消息中间件 Java 数据库连接
spring中那些让你爱不释手的代码技巧(续集上)
spring中那些让你爱不释手的代码技巧(续集)
spring中那些让你爱不释手的代码技巧(续集上)