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自执行函数的几种不同写法的比较
Aug 16 Javascript
使用jQuery避免鼠标双击的解决方案
Aug 21 Javascript
Jquery插件编写简明教程
Mar 25 Javascript
用unescape反编码得出汉字示例
Apr 24 Javascript
AngularJS初始化过程分析(引导程序)
Dec 06 Javascript
jQuery晃动层特效实现方法
Mar 09 Javascript
mvc中form表单提交的三种方式(推荐)
Aug 10 Javascript
javascript深拷贝(deepClone)详解
Aug 24 Javascript
javascript 动态样式添加的简单实现
Oct 11 Javascript
用Vue.extend构建消息提示组件的方法实例
Aug 08 Javascript
深入浅析js原型链和vue构造函数
Oct 25 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
Sep 29 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
编译问题
2006/10/09 PHP
几种有用的变型 PHP中循环语句的用法介绍
2012/01/30 PHP
php中is_null,empty,isset,unset 的区别详细介绍
2013/04/28 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
2019/04/12 PHP
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
2010/08/27 Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
同一个网页中实现多个JavaScript特效的方法
2015/02/02 Javascript
JavaScript运动减速效果实例分析
2015/08/04 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
Vue中qs插件的使用详解
2020/02/07 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
python通过colorama模块在控制台输出彩色文字的方法
2015/03/19 Python
Python基本语法经典教程
2016/03/11 Python
Python搭建HTTP服务器和FTP服务器
2017/03/09 Python
关于python的list相关知识(推荐)
2017/08/30 Python
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
Python机器学习之K-Means聚类实现详解
2018/02/22 Python
Pytorch自己加载单通道图片用作数据集训练的实例
2020/01/18 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
2020/09/25 Python
HTML5中语义化 b 和 i 标签
2008/10/17 HTML / CSS
HTML5 实战PHP之Web页面表单设计
2011/10/09 HTML / CSS
澳大利亚波西米亚风情网上商店:Czarina
2019/03/18 全球购物
数据库测试通常都包括哪些方面
2015/11/30 面试题
给客户的道歉信
2014/01/13 职场文书
工地安全标语
2014/06/07 职场文书
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL