本文参照以下两位前辈的文章,加上自己的见解,有错误之处还望大家指出

鸟哥:Javascript作用域原理

理解 JavaScript 作用域和作用域链

为什么要理解作用域

初学js便听人说这门语言作用域比较特殊,与c/c++实现的方式不大相同,下面就遇到问题了

遇见的问题

1 var name="xiaoming"
2 function show(){
3     console.log(name);
4     var name="WebWhiteCoder";
5     var age;
6     console.log(name);
7     console.log(age);
8 }
9 show();

按照一般的想法,输出的结果应该是这样的

xiaoming
WebwhiteCoder
undefined

但实际情况呢?

此时第一行声明的全局变量name却变成了undefined,function内的name却正常输出,原因何在?

答案是js的作用域链

js的作用域链:

在介绍作用域链之前,大家一定都明白这句话:js中一切皆为对象.上文那段代码定义的函数也是一个对象。

js解析器不是自上而下的一条一条按照顺序来解析代码。

原因:echo函数被调用的时候,echo的活动对象已经被创建

[callObj]={name:undefined;
}

这时候活动对象已经存在了一个name属性,且是undefined。此时全局变量中的name就被覆盖了。

注意:函数的scope属性是在定义完函数就决定了的,而不是调用的时

function factory() {var name = 'laruence';var intro = function(){alert('I am ' + name);}return intro;
}function app(para){var name = para;var func = factory();func();
}app('eve');

输出的结果:

I am laruence

先把这几个函数的作用域链上的活动属性写出来吧

app:

para:eve;name:undefined;func:undefined;

factory:

name:undefined;
intro:undefined;

那么问题来了,这个时候为什么name是undefined,明明已经对其赋值了啊?这里引用鸟哥的描述 在调用函数执行之前, 会首先创建一个活动对象, 然后搜寻这个函数中的局部变量定义,和函数定义, 将变量名和函数名都做为这个活动对象的同名属性, 对于局部变量定义,变量的值会在真正执行的时候才计算, 此时只是简单的赋为undefined。

无疑,这时候的name是一个局部变量,只有在真正执行的时候,也就是用到name的时候才会考虑到值,此时只是简单的赋给他undefined;

intro:

name:laruence;

此时用alert弹出name的值了吧,那么此时name就取得值。

头疼的预编译:

众所周知,js有变量提示的特性.如下面这个例子:

alert(name);
var name="WebWhiteCoder";

这时候正常弹出值:WebWhiteCoder.这就是因为变量提示的特点。

函数定义式也具有这个特点,但函数表达式就不行了.

<script>alert(typeof eve); //结果:functionalert(typeof walle); //结果:undefinedfunction eve() { //函数定义式alert('I am Laruence');};var walle = function() { //函数表达式
     }alert(typeof walle); //结果:function
</script>

转载于:https://www.cnblogs.com/WebWhiteCoder/p/7120799.html

JavaScript作用域学习笔记(ife2015spring学习心得)相关推荐

  1. SilverLight学习笔记--进一步学习Isolated Storage独立存储一(理论篇)

    在"silverlight如何在客户端读取文件"以及"silverlight如何在客户端写入文件"两篇文章中我们初步接触了Isolated Storage概念. ...

  2. Python3学习笔记之-学习基础(第三篇)

    Python3学习笔记之-学习基础(第三篇) 文章目录 目录 Python3学习笔记之-学习基础(第三篇) 文章目录 一.循环 1.for循环 2.while循环 3.break,continue 二 ...

  3. 强化学习笔记-强化学习概述

    强化学习笔记-强化学习概述 机器学习分类 强化学习与监督学习的异同点 强化学习基本原理 强化学习解决的是什么样的问题 强化学习分类 请分别解释随机性策略和确定性策略 回报.值函数.行为值函数三个指标的 ...

  4. 【原创】强化学习笔记|从零开始学习PPO算法编程(pytorch版本)

    从零开始学习PPO算法编程(pytorch版本)_melody_cjw的博客-CSDN博客_ppo算法 pytorch 从零开始学习PPO算法编程(pytorch版本)(二)_melody_cjw的博 ...

  5. 学习笔记 mysql_MySQL 学习笔记

    MySQL 学习笔记 1 定义 数据库中的表:一行叫一条记录.每一列叫一个属性,或一个字段. 主键:表中的某个特殊字段,具有唯一的确定的值,可以根据该字段唯一的确定一条记录 外键:表中的某个字段的值为 ...

  6. cocos2d学习笔记2——学习资源

    1. 视频 找了好几个视频,有一些讲得好的文件资源没有,后来终于找到一个讲得不错还有文件资源的,还有高清下载地址,虽然是2.2版本的,但是确实能学到不少东西,对用cocos2d做游戏有了基本的印象,对 ...

  7. lucene学习笔记_学习Lucene

    lucene学习笔记 我目前正在与一个团队合作,开始一个基于Lucene的新项目. 虽然大多数时候我会争论使用Solr还是Elasticsearch而不是简单的Lucene,但这是一个有意识的决定. ...

  8. 大数据业务学习笔记_学习业务成为一名出色的数据科学家

    大数据业务学习笔记 意见 (Opinion) A lot of aspiring Data Scientists think what they need to become a Data Scien ...

  9. Linux学习笔记------java学习

    前言 学习笔记仅供参考 该笔记是作者根据b站狂神说视频以及自己翻阅的一些资料而写 视频连接:狂神Linux视频链接 如果有兴趣的小伙伴可以前去观看 如果购买过服务器的话,可以直接使用宝塔进行傻瓜式安装 ...

最新文章

  1. mac 使用homebrew 安装mysql
  2. 展讯camera去除尺寸相关缓存
  3. 方舟修改显示服务器个数,方舟生存进化服务器模式设置教程
  4. 论文阅读:Multi-scale orderless pooling of deep convolutional activation features
  5. 改丝印的假华强北三代1562A,用芯良苦!
  6. mysql查询缓存到redis_php查询mysql并缓存到redis
  7. Java容器List接口
  8. python怎样压缩和解压缩ZIP文件
  9. mysql知识思维导图
  10. [渝粤教育] 南京审计大学 审计学基础 参考 资料
  11. ramda 函数 relation type
  12. 谷歌开发者大会召开 地图服务成亮点
  13. Ubuntu安装音频编辑软件Audacity
  14. vue 中v-model原理及应用
  15. 风险加权资产(RWA)分析管理系统
  16. 【超简易】网站ioc图标添加【超详细】
  17. Centos8怎么进行复位清屏? Centos8终端复位清屏的技巧
  18. 随机过程 自相关函数 互相关函数自协方差矩阵 互协方差矩阵的区别联系
  19. 计算机网络管理技师代号,计算机网络管理技师复习资料.doc
  20. 修复 office你的许可证不是正版_office你可能是盗版软件的受害者

热门文章

  1. 用sqlyog怎么设置mysql自动备份,利用sqlyog配置MySQL自动备份sql文件
  2. python怎么读出当前时间_Python读取Excel,日期列读出来是数字的处理
  3. 【Thymeleaf】获取绝对路径
  4. java更新无法正常安装_Java无法安装
  5. vue的route懒加载
  6. MySQL5.5的安装,连接和操作
  7. endnote咋手动输入文献_endnote如何导入参考文献?如何手动导入EndNote
  8. mysql路由器配置文件_如何安装并配置mysql 5.7.13解压缩版?
  9. mysql单表最大数据量_你的Mysql库真需要Adaptive Hash Index
  10. 华为荣耀20和x10比较_荣耀x10和荣耀20Pro哪个值得入手 荣耀x10和荣耀20Pro参数对比...