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调用WebService的示例
Apr 07 Javascript
JS 表单验证大全
Nov 23 Javascript
javaScript基础语法介绍
Feb 28 Javascript
vue组件Prop传递数据的实现示例
Aug 17 Javascript
浅谈Koa服务限流方法实践
Oct 23 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
May 18 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
Jun 12 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
Jun 12 jQuery
vue父子组件通信的高级用法示例
Aug 29 Javascript
Vue 中使用 typescript的方法详解
Feb 17 Javascript
原生js+canvas实现贪吃蛇效果
Aug 02 Javascript
js中Map和Set的用法及区别实例详解
Feb 15 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
centos 5.6 升级php到5.3的方法
2011/05/14 PHP
用PHP实现的四则运算表达式计算实现代码
2011/08/02 PHP
smarty 缓存控制前的页面静态化原理
2013/03/15 PHP
php使用sql server验证连接数据库的方法
2014/12/25 PHP
Symfony2学习笔记之系统路由详解
2016/03/17 PHP
PHP等比例压缩图片的实例代码
2018/07/26 PHP
PHP的mysqli_select_db()函数讲解
2019/01/23 PHP
PHP实现爬虫爬取图片代码实例
2021/03/03 PHP
Prototype Object对象 学习
2009/07/12 Javascript
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
教您去掉ie网页加载进度条的方法
2010/12/09 Javascript
JavaScript中json对象和string对象之间相互转化
2012/12/26 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
SpringMVC返回json数据的三种方式
2015/12/10 Javascript
angular实现商品筛选功能
2017/02/01 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
JS中使用textPath实现线条上的文字
2017/12/25 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
使用Angular-CLI构建NPM包的方法
2018/09/07 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
2018/09/29 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
js实现鼠标拖曳效果
2020/12/30 Javascript
Python matplotlib 画图窗口显示到gui或者控制台的实例
2018/05/24 Python
Python3使用Matplotlib 绘制精美的数学函数图形
2019/04/11 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
耐克美国官网:Nike.com
2016/08/01 全球购物
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
荣耀俄罗斯官网:HONOR俄罗斯
2020/10/31 全球购物
面向中国市场的在线海淘美妆零售网站:Beauty House美丽屋
2021/03/02 全球购物
自荐书封面下载
2013/11/29 职场文书
2015年毕业生自我鉴定模板
2014/09/19 职场文书
2015年林业工作总结
2015/05/14 职场文书
班主任班级管理心得体会
2016/01/07 职场文书