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 导出table内容到Excel的简单实例
Nov 19 Javascript
jquery解析XML字符串和XML文件的方法说明
Feb 21 Javascript
tuzhu_req.js 实现仿百度图片首页效果
Aug 11 Javascript
JavaScript操作select元素和option的实例代码
Jan 29 Javascript
Bootstrap创建可折叠的组件
Feb 23 Javascript
移动端翻页插件dropload.js(支持Zepto和jQuery)
Jul 27 Javascript
jQuery实现的简单百分比进度条效果示例
Aug 01 Javascript
详解webpack babel的配置
Jan 09 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
Dec 10 Javascript
jQuery分组选择器简单用法示例
Apr 04 jQuery
JS快速实现简单计算器
Apr 08 Javascript
解决vue页面刷新,数据丢失的问题
Nov 24 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版快速排序、冒泡排序
2014/04/09 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
纯js模拟div层弹性运动的方法
2015/07/27 Javascript
js严格模式总结(分享)
2016/08/22 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
Webpack执行命令参数详解
2017/06/17 Javascript
浅谈在koa2中实现页面渲染的全局数据
2017/10/09 Javascript
详解element-ui中form验证杂记
2019/03/04 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
基于Vue.js与WordPress Rest API构建单页应用详解
2019/09/16 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
2019/12/27 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
[51:26]VP vs VG 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python连接数据库学习之DB-API详解
2017/02/07 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
2017/08/07 Python
Python切片工具pillow用法示例
2018/03/30 Python
matplotlib 纵坐标轴显示数据值的实例
2018/05/25 Python
解决pycharm安装后代码区不能编辑的问题
2018/10/28 Python
Django 静态文件配置过程详解
2019/07/23 Python
python3实现单目标粒子群算法
2019/11/14 Python
致100米运动员广播稿
2014/02/14 职场文书
六一节目主持词
2014/04/01 职场文书
高中生操行评语
2014/04/25 职场文书
网络编辑求职信
2014/04/30 职场文书
红头文件任命书范本
2014/06/05 职场文书
人民调解员培训方案
2014/06/05 职场文书
2019思想汇报范文
2019/05/21 职场文书
Vue+Flask实现图片传输功能
2022/04/01 Vue.js