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 相关文章推荐
JavaScript中的Window窗口对象
Jan 16 Javascript
查看源码的工具 学习jQuery源码不错的工具
Dec 26 Javascript
纯JS实现五子棋游戏兼容各浏览器(附源码)
Apr 24 Javascript
JS将秒换成时分秒实现代码
Sep 03 Javascript
jQuery定义背景动态切换效果的方法
Mar 23 Javascript
js库Modernizr的介绍和使用
May 07 Javascript
使用JavaScript为一张图片设置备选路径的方法
Jan 04 Javascript
JavaScript函数节流的两种写法
Apr 07 Javascript
js原生日历的实例(推荐)
Oct 31 Javascript
python虚拟环境 virtualenv的简单使用
Jan 21 Javascript
Vue项目中使用flow做类型检测的方法
Mar 18 Javascript
Element Input输入框的使用方法
Jul 26 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
不用数据库的多用户文件自由上传投票系统(3)
2006/10/09 PHP
解析如何用php screw加密php源代码
2013/06/20 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
2013/08/10 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
PHP入门教程之PHP操作MySQL的方法分析
2016/09/11 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
List all the Databases on a SQL Server
2007/06/21 Javascript
9行javascript代码获取QQ群成员具体实现
2013/10/16 Javascript
Javasipt:操作radio标签详解
2013/12/30 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
2016/03/16 Javascript
jQuery实现底部浮动窗口效果
2016/09/07 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
angularjs实现猜大小功能
2017/10/23 Javascript
nodejs的路径问题的解决
2018/06/30 NodeJs
Vue.js实现数据响应的方法
2018/08/13 Javascript
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
Echart折线图手柄触发事件示例详解
2018/12/16 Javascript
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
谈谈JavaScript中的垃圾回收机制
2020/09/17 Javascript
[01:02:06]LGD vs Mineski Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
python通过smpt发送邮件的方法
2015/04/30 Python
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
对python Tkinter Text的用法详解
2018/10/11 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
python命令 -u参数用法解析
2019/10/24 Python
精美的手工家居和生活用品:Nkuku
2019/11/01 全球购物
2019年.net常见面试问题
2012/02/12 面试题
干部下基层实施方案
2014/03/14 职场文书
论文诚信承诺书
2014/05/23 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
雷锋的观后感
2015/06/10 职场文书
MongoDB支持的数据类型
2022/04/11 MongoDB