JavaScript作用域学习笔记(ife2015spring学习心得)
本文参照以下两位前辈的文章,加上自己的见解,有错误之处还望大家指出
鸟哥: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学习心得)相关推荐
- SilverLight学习笔记--进一步学习Isolated Storage独立存储一(理论篇)
在"silverlight如何在客户端读取文件"以及"silverlight如何在客户端写入文件"两篇文章中我们初步接触了Isolated Storage概念. ...
- Python3学习笔记之-学习基础(第三篇)
Python3学习笔记之-学习基础(第三篇) 文章目录 目录 Python3学习笔记之-学习基础(第三篇) 文章目录 一.循环 1.for循环 2.while循环 3.break,continue 二 ...
- 强化学习笔记-强化学习概述
强化学习笔记-强化学习概述 机器学习分类 强化学习与监督学习的异同点 强化学习基本原理 强化学习解决的是什么样的问题 强化学习分类 请分别解释随机性策略和确定性策略 回报.值函数.行为值函数三个指标的 ...
- 【原创】强化学习笔记|从零开始学习PPO算法编程(pytorch版本)
从零开始学习PPO算法编程(pytorch版本)_melody_cjw的博客-CSDN博客_ppo算法 pytorch 从零开始学习PPO算法编程(pytorch版本)(二)_melody_cjw的博 ...
- 学习笔记 mysql_MySQL 学习笔记
MySQL 学习笔记 1 定义 数据库中的表:一行叫一条记录.每一列叫一个属性,或一个字段. 主键:表中的某个特殊字段,具有唯一的确定的值,可以根据该字段唯一的确定一条记录 外键:表中的某个字段的值为 ...
- cocos2d学习笔记2——学习资源
1. 视频 找了好几个视频,有一些讲得好的文件资源没有,后来终于找到一个讲得不错还有文件资源的,还有高清下载地址,虽然是2.2版本的,但是确实能学到不少东西,对用cocos2d做游戏有了基本的印象,对 ...
- lucene学习笔记_学习Lucene
lucene学习笔记 我目前正在与一个团队合作,开始一个基于Lucene的新项目. 虽然大多数时候我会争论使用Solr还是Elasticsearch而不是简单的Lucene,但这是一个有意识的决定. ...
- 大数据业务学习笔记_学习业务成为一名出色的数据科学家
大数据业务学习笔记 意见 (Opinion) A lot of aspiring Data Scientists think what they need to become a Data Scien ...
- Linux学习笔记------java学习
前言 学习笔记仅供参考 该笔记是作者根据b站狂神说视频以及自己翻阅的一些资料而写 视频连接:狂神Linux视频链接 如果有兴趣的小伙伴可以前去观看 如果购买过服务器的话,可以直接使用宝塔进行傻瓜式安装 ...
最新文章
- mac 使用homebrew 安装mysql
- 展讯camera去除尺寸相关缓存
- 方舟修改显示服务器个数,方舟生存进化服务器模式设置教程
- 论文阅读:Multi-scale orderless pooling of deep convolutional activation features
- 改丝印的假华强北三代1562A,用芯良苦!
- mysql查询缓存到redis_php查询mysql并缓存到redis
- Java容器List接口
- python怎样压缩和解压缩ZIP文件
- mysql知识思维导图
- [渝粤教育] 南京审计大学 审计学基础 参考 资料
- ramda 函数 relation type
- 谷歌开发者大会召开 地图服务成亮点
- Ubuntu安装音频编辑软件Audacity
- vue 中v-model原理及应用
- 风险加权资产(RWA)分析管理系统
- 【超简易】网站ioc图标添加【超详细】
- Centos8怎么进行复位清屏? Centos8终端复位清屏的技巧
- 随机过程 自相关函数 互相关函数自协方差矩阵 互协方差矩阵的区别联系
- 计算机网络管理技师代号,计算机网络管理技师复习资料.doc
- 修复 office你的许可证不是正版_office你可能是盗版软件的受害者
热门文章
- 用sqlyog怎么设置mysql自动备份,利用sqlyog配置MySQL自动备份sql文件
- python怎么读出当前时间_Python读取Excel,日期列读出来是数字的处理
- 【Thymeleaf】获取绝对路径
- java更新无法正常安装_Java无法安装
- vue的route懒加载
- MySQL5.5的安装,连接和操作
- endnote咋手动输入文献_endnote如何导入参考文献?如何手动导入EndNote
- mysql路由器配置文件_如何安装并配置mysql 5.7.13解压缩版?
- mysql单表最大数据量_你的Mysql库真需要Adaptive Hash Index
- 华为荣耀20和x10比较_荣耀x10和荣耀20Pro哪个值得入手 荣耀x10和荣耀20Pro参数对比...