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 相关文章推荐
IE中jscript/javascript的条件编译
Sep 07 Javascript
jquery下json数组的操作实现代码
Aug 09 Javascript
jquery 之 $().hover(func1, funct2)使用方法
Jun 14 Javascript
jQuery中height()方法用法实例
Dec 24 Javascript
javascript删除数组重复元素的方法汇总
Jun 24 Javascript
noty ? jQuery通知插件全面解析
May 18 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
Jan 29 Javascript
js实现textarea限制输入字数
Feb 13 Javascript
Javascript 实现匿名递归的实例代码
May 25 Javascript
Vue项目pdf(base64)转图片遇到的问题及解决方法
Oct 19 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
Aug 23 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
Oct 10 jQuery
详解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
php初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
PHP curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
Javascript 构造函数 实例分析
2008/11/26 Javascript
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
修改js Calendar日历控件 兼容IE9/谷歌/火狐
2013/01/04 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
2014/07/06 Javascript
javascript实现表格排序 编辑 拖拽 缩放
2015/01/02 Javascript
JS实现兼容性较好的随屏滚动效果
2015/11/09 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
2015/11/19 Javascript
jQuery Mobile中的button按钮组件基础使用教程
2016/05/23 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
js css自定义分页效果
2017/02/24 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
2017/12/06 jQuery
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
Vue路由切换时的左滑和右滑效果示例
2018/05/29 Javascript
在vue中使用公共过滤器filter的方法
2018/06/26 Javascript
Vue-component全局注册实例
2018/09/06 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
Python模拟登录验证码(代码简单)
2016/02/06 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
2017/01/12 Python
详解Python中for循环是如何工作的
2017/06/30 Python
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
Python引用计数操作示例
2018/08/23 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
美国体育用品商店:Rally House(NCAA、NFL、MLB、NBA、NHL和MLS)
2018/01/03 全球购物
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
小学生自我评价范文
2014/01/25 职场文书
个人简历自我评价
2014/02/02 职场文书
高中毕业自我评价
2014/02/08 职场文书
如何写好建议书
2014/03/13 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
原来实习报告是这样写的呀!
2019/07/03 职场文书
Docker下安装Oracle19c
2022/04/13 Servers