JS作用域闭包、预解释和this关键字综合实例解析


Posted in Javascript onDecember 16, 2016

本文实例分析了JS作用域闭包、预解释和this关键字。分享给大家供大家参考,具体如下:

var number = 2;
var obj = {number : 5,
  fn1 : ( function() {
  this.number *= 2;
  number=number*2;
  var number=3;
    return function() {
      this.number *= 2;
      number*=3;
      alert(number);
    }
  } )()
};
var fn1 = obj.fn1;
alert(number);
fn1();
obj.fn1();
alert(window.number);
alert(obj.number);

【解析】

1. fn1本身后面就有(),所以var fn1 = obj.fn1;时他已经被执行,但是里面的return function并没有被执行

2. alert(number);输出全局的number,本来是2,经过var fn1 = obj.fn1;后,相当于执行了

this.number *= 2;
number=number*2;
var number=3;

这三句话

注意:任何一个直接执行的匿名方法,他的this指向window

所以this.number *= 2;使得全局变量变成4,即输出4

而number=number*2;他是去看作用域块里的number,var number=3;作用域声明在先,但是没有赋值,所以number=number*2;这句话其实没用

3. 执行到fn1();就是执行fn1里面的return function,也就是这三句话

this.number *= 2;
number*=3;
alert(number);

这时候依然是个匿名方法,所以this.number *= 2;使得全局变量变为8,number*=3;去找作用域块里的number,外层定义number为3,所以alert(number);就是9,如果是alert(this.number);则指向全局变量,即输出8

4. obj.fn1();,依然执行fn1里面的return function,也就是这三句话

this.number *= 2;
number*=3;
alert(number);

但这时this指向obj,this.number *= 2;使得obj里的number变为10,number*=3;还是去找作用域块,由于上面变为9,所以这里就是27,alert(number);输出的是作用域块的number,即27,如果是alert(this.number);则指向obj的number,即输出10

5. alert(window.number);经过上面几轮,全局变量变为8(即执行obj.fn1();对全局变量无影响)

6. alert(obj.number);只有这句话obj.fn1();,改变了obj.number,所以输出10

(function(){
   var a=10;
  fn();
  function fn(){
    var a=a+10;
    console.log(a);
     return a;
  }
  console.log(a);
  console.log(fn()+10);
})();

fn函数里的a先被声明但是没有赋值,然后进行运算,他不会去找函数外面的同名变量,因为他已经在里面被声明了。一个不是数字的和数字进行运算,输出NaN

console.log(fn()+10);这句话要输出两个值:console.log(fn());和console.log(fn()+10);

结果:

NaN
10
NaN
NaN

如果题目改成

(function(){
  var a=10;
  fn();
  function fn(){
    a=a+10;
    console.log(a);
    return a;
  }
  console.log(a);
  console.log(fn()+10);
})();

结果:

20

20

30

40

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
js bind 函数 使用闭包保存执行上下文
Dec 26 Javascript
js 取时间差去掉周六周日实现代码
Dec 25 Javascript
Javascript 鼠标移动上去 滑块跟随效果代码分享
Nov 23 Javascript
javascript 获取HTML DOM父、子、临近节点
Jun 16 Javascript
js实现字符串转日期格式的方法
May 20 Javascript
JS+HTML5 FileReader对象用法示例
Apr 07 Javascript
JavaScript之事件委托实例(附原生js和jQuery代码)
Jul 22 jQuery
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
Sep 02 Javascript
vue-router2.0 组件之间传参及获取动态参数的方法
Nov 10 Javascript
vue-cli脚手架config目录下index.js配置文件的方法
Mar 13 Javascript
Vue 实现手动刷新组件的方法
Feb 19 Javascript
vue视图不更新情况详解
May 16 Javascript
详解js的事件处理函数和动态创建html标记方法
Dec 16 #Javascript
利用js来实现缩略语列表、文献来源链接和快捷键列表
Dec 16 #Javascript
JS限制条件补全问题实例分析
Dec 16 #Javascript
Node.js用readline模块实现输入输出
Dec 16 #Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
Dec 16 #Javascript
在JS中a标签加入单击事件屏蔽href跳转页面
Dec 16 #Javascript
概述jQuery中的ajax方法
Dec 16 #Javascript
You might like
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
PHP基础知识介绍
2013/09/17 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
ThinkPHP关于session的操作方法汇总
2014/07/18 PHP
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
新鲜出炉的js tips提示效果
2011/04/03 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
2016/10/16 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
Vue AST源码解析第一篇
2017/07/19 Javascript
JavaScript实现的浏览器下载文件的方法
2017/08/09 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
vue使用技巧及vue项目中遇到的问题
2018/06/04 Javascript
详解vue axios二次封装
2018/07/22 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
vue项目打包之开发环境和部署环境的实现
2020/04/23 Javascript
Django1.7+python 2.78+pycharm配置mysql数据库教程
2014/11/18 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
2018/04/10 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
django中ORM模型常用的字段的使用方法
2019/03/05 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
2019/05/13 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
python 实现将多条曲线画在一幅图上的方法
2019/07/07 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
Python pexpect模块及shell脚本except原理解析
2020/08/03 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
2020/04/27 HTML / CSS
支票、地址标签、包装纸和慰问卡:Current Catalog
2018/01/30 全球购物
2015年高一班主任工作总结
2015/05/13 职场文书
Html5生成验证码的示例代码
2021/05/10 Javascript
js实现自动锁屏功能
2021/06/02 Javascript
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle