JS作用域深度解析


Posted in Javascript onDecember 29, 2016

本文实例为大家深度剖析JS的作用域,代码注释详细,供大家参考,具体内容如下

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>作用域问题</title>
</head>
<body>
<script>
 /*
 * 1.全局变量与局部变量
 * 外层变量可以在内层调用(全局),内层变量不能在外层调用(局部)
 * */

 var a = 1;
 (function () {
  // 外部变量可以在内部调用
  alert(a);
 })();

 /*function test() {
  // 内部变量不能在外部调用
  var a = 2;
 }
 alert(a); // 报错*/

 /*
 * 下面举个例子:
 * 函数调用只是回到函数定义的地方,调用一下函数
 * 这里在bbb函数中,调用aaa函数,
 * 这时的aaa函数并不是被放入bbb函数中,而是在原定义的地方
 * 这是的aaa中没有变量a,所以去访问全局变量中的a
 * */

 /*var a = 10;
 function aaa() {
  alert(a);
 }
 function bbb() {
  var a = 20;
  aaa();
 }
 bbb(); // 10*/

 /*
 * 2.当var不加的时候,会自动变成全局变量
 * 在全局环境中,不加var和加var效果一样,都是全局变量
 * 在局域环境中,加var会被定义为局部变量,不加var会被定义为全局变量
 * */

 /*function test() {
  var a = 10; // 外部访问不到
  b = 10;  // 相当于全局变量
  // 上面相当于:var a = b = 10;
 }
 test();
 alert(b); // 10
 alert(a); // 报错*/

 /*
 * 3.变量查找按照就近原则去查找
 * var定义的变量,当就近查找没有找到就去外层查找
 * */

 /*var a = 10;
 (function() {
  var a = 20;
  // a在匿名函数中var定义了,所以找到为20
  alert(a); // 20
 })();*/

 /*var a = 10;
 (function() {
  a = 20; // 相当于全局变量,将外部的var a = 20;
  // 在匿名函数中没有找到var定义的a,然后去外层去查找
  // 外部查找到了,var a = 10 = 20;
  alert(a); // 20
 })();*/

 /*var a = 10;
 (function() {
  // 在匿名函数中没有找到var定义的a,然后去外层去查找
  // 外部查找到了,var a = 10
  alert(a); // 10
  a = 20;
 })();*/

 /*var a = 10;
 (function() {
  // 在匿名函数中找到var定义的a,
  // 这里的var a = 20,存在变量提升,
  // 在执行alert(a)之前,变量提示有var a;
  // 但是a没有值,所有返回undefined
  alert(a); // undefined
  var a = 20;

  // 在变量提升的情况下,相当于下面:
  // var a;
  // alert(a);
  // a = 20;
 })(;*/

 /*var a = 10;
 (function() {
  // 执行bbb,bbb中的a=20,但是与匿名函数和全局变量a无关
  bbb();
  // 在匿名函数中查找var定义的a,发现没有
  // 继续在外层中查找,发现了 var a = 10;
  alert(a); // 10
  function bbb() {
   var a = 20;
  }
 })();*/

 /* var a = 10;
 (function() {
  bbb();
  // 在匿名函数中查找var定义的a,发现没有
  // 继续在外层中查找,发现了 var a = 10 = 20;
  alert(a); // 20
  function bbb() {
   // 没有var定义,所有为全局变量,外面的全局变量 var a = 10 = 20;
   a = 20;
  }
 })();*/


 /*
 * 当参数与局部变量重名时,优先级等同
 * */

 /*var a = 10;
 (function (a) {
  // 这里的参数a是基本类型,按值传参的
  // 相当于在匿名函数内部重新定义了一个a,
  // 且与外层的a不相关
  a += 3;
 })(a);
 alert(a); // 10*/

 /*var a = [1,2,3];
 (function (a) {
  // 这里的参数a是特殊类型,按引用传参的
  // 相当于在匿名函数内部重新定义了一个a,
  // 但是这个a是外层a的一个别名,它们引用了同一个地址
  // 所以内部a添加值,外部a可以访问到
  a.push(4);
 })(a);
 alert(a); // [1,2,3,4]*/


 /*var a = [1,2,3];
 (function (a) {
  // 这里的参数a是特殊类型,按引用传参的
  // 相当于在匿名函数内部重新定义了一个a,
  // 但是这个a是外层a的一个别名,它们引用了同一个地址
  // 所以内部a添加值,外部a可以访问到

  // 但是,这里的a又重新赋值了新的数组,断开了与外层的关系
  a = [1,2,3,4];
 })(a);
 alert(a); // [1,2,3]*/



</script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
QQ登录简单实现代码
Mar 09 Javascript
jQuery源码分析-01总体架构分析
Nov 14 Javascript
js实现的常用的左侧导航效果
Oct 17 Javascript
Javascript玩转继承(二)
May 08 Javascript
json属性名为什么要双引号(个人猜测)
Jul 31 Javascript
jQuery入门基础知识学习指南
Aug 14 Javascript
javascript性能优化之DOM交互操作实例分析
Dec 12 Javascript
常用的javascript设计模式
Jan 11 Javascript
Angular数据绑定机制原理
Apr 17 Javascript
微信小程序实现限制用户转发功能的实例代码
Feb 22 Javascript
JS数组转字符串实现方法解析
Sep 04 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
Dec 26 Vue.js
javascript中的深复制详解及实例分析
Dec 29 #Javascript
canvas学习之API整理笔记(一)
Dec 29 #Javascript
Javascript Function.prototype.bind详细分析
Dec 29 #Javascript
jQuery自定义插件详解及实例代码
Dec 29 #Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
Dec 29 #Javascript
JavaScript获取短信验证码(周期性)
Dec 29 #Javascript
JavaScript实现同一个页面打开多张图片
Dec 29 #Javascript
You might like
php实现购物车产品删除功能(2)
2020/07/23 PHP
密码框显示提示文字jquery示例
2013/08/29 Javascript
用javascript添加控件自定义属性解析
2013/11/25 Javascript
js返回上一页并刷新的多种实现方法
2014/02/26 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
jQuery中:last选择器用法实例
2014/12/30 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
微信小程序 参数传递实例代码
2017/03/20 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
vue input输入框模糊查询的示例代码
2018/05/22 Javascript
vue内置组件transition简单原理图文详解(小结)
2018/07/12 Javascript
Vue中的验证登录状态的实现方法
2019/03/09 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
2020/04/30 Javascript
在Python中封装GObject模块进行图形化程序编程的教程
2015/04/14 Python
python使用筛选法计算小于给定数字的所有素数
2018/03/19 Python
python查看模块,对象的函数方法
2018/10/16 Python
Python 进程之间共享数据(全局变量)的方法
2019/07/16 Python
pytorch 可视化feature map的示例代码
2019/08/20 Python
python-numpy-指数分布实例详解
2019/12/07 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
2020/04/20 Python
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
常见的软件开发流程有哪些
2015/11/14 面试题
药物学专业学生的自我评价
2013/10/27 职场文书
中专生求职自荐信范文
2013/12/22 职场文书
《小松树和大松树》教学反思
2014/02/20 职场文书
先进党支部事迹材料
2014/12/24 职场文书
大学生逃课检讨书
2015/05/04 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
2016党性教育学习心得体会
2016/01/21 职场文书
goland设置颜色和字体的操作
2021/05/05 Golang
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
2021/05/21 PostgreSQL
在CSS中使用when/else的方法
2022/01/18 HTML / CSS
Java Spring Boot 正确读取配置文件中的属性的值
2022/04/20 Java/Android
python实现商品进销存管理系统
2022/05/30 Python