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 相关文章推荐
动态的改变IFrame的高度实现IFrame自动伸展适应高度
Dec 28 Javascript
详解AngularJS中的表格使用
Jun 16 Javascript
jquery实现图片上传前本地预览功能
May 10 Javascript
jquery 动态合并单元格的实现方法
Aug 26 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
Apr 13 Javascript
Angular中点击li标签实现更改颜色的核心代码
Dec 08 Javascript
webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)
Jan 09 Javascript
mpvue小程序仿qq左滑置顶删除组件
Aug 03 Javascript
Vue源码之关于vm.$delete()/Vue.use()内部原理详解
May 01 Javascript
vue实现条件叠加搜索的解决方法
May 28 Javascript
Layui事件监听的实现(表单和数据表格)
Oct 17 Javascript
JavaScript监听触摸事件代码实例
Dec 30 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
PHP中对数据库操作的封装
2006/10/09 PHP
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
主流PHP框架的优缺点对比分析
2014/12/25 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
PHP实现正则匹配所有括号中的内容
2018/06/22 PHP
js对象与打印对象分析比较
2013/04/23 Javascript
js复制网页内容并兼容各主流浏览器的代码
2013/12/17 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
JQuery ztree带筛选、异步加载实例讲解
2016/02/25 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
深入理解vue-router之keep-alive
2017/08/31 Javascript
js封装成插件_Canvas统计图插件编写实例
2017/09/12 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
jquery实现Ajax请求的几种常见方式总结
2019/05/28 jQuery
Python中按值来获取指定的键
2019/03/04 Python
基于python的socket实现单机五子棋到双人对战
2020/03/24 Python
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
简单介绍一下pyinstaller打包以及安全性的实现
2020/06/02 Python
python删除指定列或多列单个或多个内容实例
2020/06/28 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
Coltorti Boutique官网:来自意大利的设计师品牌买手店
2018/11/09 全球购物
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
普天C++笔试题
2016/03/20 面试题
广州盈通面试题
2015/12/05 面试题
医院护士专业个人的求职信
2013/12/09 职场文书
关于毕业的广播稿
2014/01/10 职场文书
护士思想汇报
2014/01/12 职场文书
保管员岗位职责
2015/02/14 职场文书