js 作用域和变量详解


Posted in Javascript onFebruary 16, 2017

一、说起变量的提升呢,首先我们先看一段简单的代码

<!doctype html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
</head>
<body>
 <script>
  var v = 'hello world';
  alert(v);
 </script>
</body>
</html>

以上代码执行的结果是hello world

然后在看一段代码:

<!doctype html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
</head>
<body>
 <script>
  var v='Hello World';
  (function(){
   alert(v);
  })();
 </script>
</body>
</html>

执行的结果和第一段代码一样hello world

好了,接下来在看这段代码:

<!doctype html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
</head>
<body>
 <script>
  var v='Hello World';
  (function(){
   alert(v);
   var v='I love you';
   alert(v);
  })();
 </script>
</body>
</html>

以上代码执行的结果: 第一个弹出的是undefined;第二个结果是I love you。为什么会有这样的结果呢?

这就跟刚开始提到的变量提升有关系哦~~~下面我们来做下总结:

最后一段代码展现了2个知识点:

1、变量提升

2、作用域链

首先来说作用域链,js访问一个变量时会优先在该作用域内(访问时的那个作用域)寻找是否声明过这个变量,如果该变量已经存在,则直接使用它的值,否则会寻找该作用域的‘父作用域/上级作用域',依次类推,直到找到全局作用域为止。

关于变量提升是指:js在解析的时候总是会将var,function这类关键词的声明语句提升至作用域的最顶部(注意:这里只会提升声明的部分,赋值不会被提升)

所以,由此看来,上述的那段代码就等于:

<!doctype html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
</head>
<body>
 <script>
  var v='Hello World';
  (function () {
   var v; //先将该作用域下的变量提升,但没有赋值
   alert(v); //所以此时是undefined
   var v='I love you';
   alert(v); //I love you
  })();
 </script>
</body>
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
一种JavaScript的设计模式
Nov 22 Javascript
JObj预览一个JS的框架
Mar 13 Javascript
js性能优化技巧
Nov 29 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
May 25 Javascript
深入理解bootstrap框架之入门准备
Oct 09 Javascript
Node.js使用NodeMailer发送邮件实例代码
Mar 06 Javascript
解析Angular 2+ 样式绑定方式
Jan 15 Javascript
JS点击动态添加标签、删除指定标签的代码
Apr 18 Javascript
Vue递归实现树形菜单方法实例
Nov 06 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
Dec 29 jQuery
JS学习笔记之闭包小案例分析
May 29 Javascript
vue开发简单上传图片功能
Jun 30 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
Feb 16 #Javascript
js面向对象编程总结
Feb 16 #Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
Feb 16 #Javascript
JS实现DIV高度自适应窗口示例
Feb 16 #Javascript
Js apply方法详解
Feb 16 #Javascript
JavaScript实现的XML与JSON互转功能详解
Feb 16 #Javascript
js实现文字无缝向上滚动
Feb 16 #Javascript
You might like
php $_SERVER当前完整url的写法
2009/11/12 PHP
php入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
2014/07/22 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
2015/01/22 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
音乐播放用的的几个函数
2006/09/07 Javascript
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
浅析Node.js查找字符串功能
2014/09/03 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
parabola.js抛物线与加入购物车效果的示例代码
2017/10/25 Javascript
axios中cookie跨域及相关配置示例详解
2017/12/20 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
vue+axios+promise实际开发用法详解
2018/10/15 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
请求时token过期自动刷新token操作
2020/09/11 Javascript
仿照Element-ui实现一个简易的$message方法
2020/09/14 Javascript
[04:47]DOTA2-潍坊风行电子俱乐部探秘
2014/08/08 DOTA
在树莓派2或树莓派B+上安装Python和OpenCV的教程
2015/03/30 Python
理解生产者消费者模型及在Python编程中的运用实例
2016/06/26 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
Python使用20行代码实现微信聊天机器人
2020/06/05 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
2020/12/01 Python
css3圆角样式分享自定义按钮样式
2013/12/27 HTML / CSS
程序员机试试题汇总
2012/03/07 面试题
护理专业的自荐信
2013/10/22 职场文书
对标管理实施方案
2014/03/12 职场文书
党员国庆节演讲稿范文2014
2014/09/21 职场文书
幼儿教师年度个人总结
2015/02/05 职场文书
让世界充满爱观后感
2015/06/10 职场文书
解决flex布局中子项目尺寸不受flex-shrink限制
2022/05/11 HTML / CSS