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 23 Javascript
jquery ajax 检测用户注册时用户名是否存在
Nov 03 Javascript
Javascript 设计模式(二) 闭包
May 26 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
May 12 Javascript
ExtJS自定义主题(theme)样式详解
Nov 18 Javascript
Javascript冒泡排序算法详解
Dec 03 Javascript
jQuery展示表格点击变色、全选、删除
Jan 05 Javascript
addeventlistener监听scroll跟touch(实例讲解)
Aug 04 Javascript
javaScript实现复选框全选反选事件详解
Nov 20 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
Sep 01 Javascript
jquery css实现流程进度条
Mar 26 jQuery
为什么node.js不适合大型项目
Apr 28 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的5个入手程序
2006/11/23 PHP
php中计算未知长度的字符串哪个字符出现的次数最多的代码
2012/08/14 PHP
PHP常用编译参数中文说明
2014/09/27 PHP
php 读取输出其他文件的实现方法
2016/07/26 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
2018/03/12 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
JavaScript实现数组在指定位置插入若干元素的方法
2015/04/06 Javascript
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
详解JavaScript对象序列化
2016/01/19 Javascript
jQuery图片加载显示loading效果
2016/11/04 Javascript
jQuery实现立体式数字滚动条增加效果
2016/12/21 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
2017/02/10 Javascript
Nodejs连接mysql并实现增、删、改、查操作的方法详解
2018/01/04 NodeJs
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
2018/06/14 Javascript
Python及PyCharm下载与安装教程
2017/11/18 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
Python3使用Matplotlib 绘制精美的数学函数图形
2019/04/11 Python
python路径的写法及目录的获取方式
2019/12/26 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
Python爬虫入门教程02之笔趣阁小说爬取
2021/01/24 Python
实例讲解HTML5的meta标签的一些应用
2015/12/08 HTML / CSS
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
怎样声明子类
2013/07/02 面试题
卫校中专生个人自我评价
2013/09/19 职场文书
车间班组长岗位职责
2013/11/13 职场文书
教师师德演讲稿
2014/05/06 职场文书
管理标语大全
2014/06/24 职场文书
物理学专业求职信
2014/07/04 职场文书
初中班主任工作总结2015
2015/05/13 职场文书
html+css 实现简易导航栏功能
2021/04/07 HTML / CSS
JavaScript使用canvas绘制坐标和线
2021/04/28 Javascript
如何利用opencv判断两张图片是否相同详解
2021/07/07 Python
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS