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 相关文章推荐
js 浮动层菜单收藏
Jan 16 Javascript
jQuery 性能优化指南 (1)
May 21 Javascript
js 如何实现对数据库的增删改查
Nov 23 Javascript
JavaScript实现复制功能各浏览器支持情况实测
Jul 18 Javascript
深入探寻javascript定时器
Jan 02 Javascript
JavaScript删除数组元素的方法
Mar 20 Javascript
JS扩展方法实例分析
Apr 15 Javascript
js浏览器html5表单验证
Oct 17 Javascript
jQuery中$.ajax()方法参数解析
Oct 22 Javascript
echarts饼图扇区添加点击事件的实例
Oct 16 Javascript
Vue 自定义动态组件实例详解
Mar 28 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
Oct 24 Javascript
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
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
PHP 读取和修改大文件的某行内容的代码
2009/10/30 PHP
php set_time_limit(0) 设置程序执行时间的函数
2010/05/26 PHP
php按字符无乱码截取中文的方法
2015/03/27 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
JQUERY复选框CHECKBOX全选,取消全选
2008/08/30 Javascript
jQuery的初始化与对象构建之浅析
2011/04/12 Javascript
jQuery侧边栏随窗口滚动实现方法
2013/03/04 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
js select option对象小结
2013/12/20 Javascript
js实现表单及时验证功能 用户信息立即验证
2016/09/13 Javascript
巧用数组制作图片切换js代码
2016/11/29 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
vue教程之toast弹框全局调用示例详解
2020/08/24 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
2018/01/04 Javascript
Vue实现手机计算器
2020/08/17 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
2020/09/04 Javascript
js正则表达式简单校验方法
2021/01/03 Javascript
Python编写登陆接口的方法
2017/07/10 Python
Python入门之三角函数atan2()函数详解
2017/11/08 Python
点球小游戏python脚本
2018/05/22 Python
朴素贝叶斯Python实例及解析
2018/11/19 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
Python实现自动签到脚本的示例代码
2020/08/19 Python
基于python实现复制文件并重命名
2020/09/16 Python
Django框架请求生命周期实现原理
2020/11/13 Python
毕业生自我鉴定
2013/11/05 职场文书
办公室前台岗位职责范本
2013/12/10 职场文书
客服工作职责
2013/12/11 职场文书
CAD制图设计师自荐信
2014/01/29 职场文书
工程质量承诺书范文
2014/03/27 职场文书
敬老院院长事迹材料
2014/05/21 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
群众路线教育实践活动剖析材料
2014/09/30 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android