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对象弹出一个层
Mar 26 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
Mar 20 Javascript
js 使用form表单select类实现级联菜单效果
Dec 19 Javascript
父页面显示遮罩层弹出半透明状态的dialog
Mar 04 Javascript
JavaScript将数字转换成大写中文的方法
Mar 23 Javascript
Jquery 分页插件之Jquery Pagination
Aug 25 Javascript
jquery调整表格行tr上下顺序实例讲解
Jan 09 Javascript
深入理解jquery跨域请求方法
May 18 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
Nov 25 Javascript
详解webpack+angular2开发环境搭建
Jun 28 Javascript
基于JavaScript实现五子棋游戏
Aug 26 Javascript
vue中v-show和v-if的异同及v-show用法
Jun 06 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
虹吸式咖啡探讨–研磨
2021/03/03 冲泡冲煮
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
2013/07/03 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
2016/12/29 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
PHP的PDO连接讲解
2019/01/24 PHP
javascript中日期转换成时间戳的小例子
2013/03/21 Javascript
javascript 实现键盘上下左右功能的小例子
2013/09/15 Javascript
jQuery事件处理的特征(事件命名机制)
2016/08/23 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
基于代数方程库Algebra.js解二元一次方程功能示例
2017/06/09 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
vue-cli基础配置及webpack配置修改的完整步骤
2019/10/20 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
Python切换pip安装源的方法详解
2016/11/18 Python
Python中字符串的修改及传参详解
2016/11/30 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
利用Pycharm断点调试Python程序的方法
2018/11/29 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
pycharm安装及如何导入numpy
2020/04/03 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
阿巴庭院:Abba Patio
2019/06/18 全球购物
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
公司成立感言
2014/01/11 职场文书
学校大课间活动方案
2014/01/30 职场文书
超市开店计划书
2014/04/26 职场文书
爱国主义演讲稿
2014/05/07 职场文书
商务英语专业毕业生求职信
2014/07/06 职场文书
反四风个人对照检查材料思想汇报
2014/09/25 职场文书
运动会开幕词
2015/01/28 职场文书
个人总结怎么写
2015/02/26 职场文书
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸