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 相关文章推荐
JS关键字变色实现思路及代码
Feb 21 Javascript
jquery animate实现鼠标放上去显示离开隐藏效果
Jul 21 Javascript
简易的投票系统以及js刷票思路和方法
Apr 07 Javascript
js实现新浪微博首页效果
Oct 16 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
Jan 20 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
Jan 04 Javascript
JavaScript函数基础详解
Feb 03 Javascript
Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法
Jul 09 Javascript
Angular.js组件之input mask对input输入进行格式化详解
Jul 10 Javascript
React Native自定义控件底部抽屉菜单的示例
Feb 08 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
Sep 05 Javascript
Vue使用localStorage存储数据的方法
May 27 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
Smarty安装配置方法
2008/04/10 PHP
最新用php获取谷歌PR值算法,附上php查询PR值代码示例
2011/12/25 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
php正则表达式学习笔记
2015/11/13 PHP
PHP 类与构造函数解析
2017/02/06 PHP
jQuery 动态云标签插件
2014/11/11 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
JS基于正则表达式的替换操作(replace)用法示例
2017/04/28 Javascript
js读取本地文件的实例
2017/12/22 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
Webpack5正式发布,有哪些新特性
2020/10/12 Javascript
[02:51]DOTA2英雄基础教程 艾欧
2014/01/13 DOTA
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
python中使用smtplib和email模块发送邮件实例
2014/04/22 Python
python通过加号运算符操作列表的方法
2015/07/28 Python
Python减少循环层次和缩进的技巧分析
2016/03/15 Python
python实现汉诺塔递归算法经典案例
2021/03/01 Python
Python实现进程同步和通信的方法
2018/01/02 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
Python爬虫:将headers请求头字符串转为字典的方法
2019/08/21 Python
python3实现弹弹球小游戏
2019/11/25 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
关于迟到的检讨书
2014/01/26 职场文书
求职毕业生自荐书
2014/02/08 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
通报表扬范文
2015/01/17 职场文书
《酸的和甜的》教学反思
2016/02/18 职场文书
Python matplotlib多个子图绘制整合
2022/04/13 Python
win10如何快速切换窗口 win10切换窗口快捷键分享
2022/07/23 数码科技