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实现shift/ctrl/alt按键的获取
Apr 08 Javascript
js获取客户端外网ip的简单实例
Nov 21 Javascript
用js替换除数字与逗号以外的所有字符的代码
Jun 07 Javascript
jQuery中:hidden选择器用法实例
Dec 30 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
Mar 18 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
Dec 10 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
May 09 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
May 18 Javascript
深入理解setTimeout函数和setInterval函数
May 20 Javascript
Vue.js实现拖放效果的实例
Sep 30 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
Mar 19 Javascript
Angular(5.2->6.1)升级小结
Dec 27 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
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
ThinkPHP中order()使用方法详解
2016/04/19 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
PHP7 新增功能
2021/03/09 PHP
jQuery 连续列表实现代码
2009/12/21 Javascript
理解JSON:3分钟课程
2011/10/28 Javascript
js防止表单重复提交实现代码
2012/09/05 Javascript
AngularJS基础知识
2014/12/21 Javascript
js与jquery实时监听输入框值的oninput与onpropertychange方法
2015/02/05 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
在Ubuntu系统上安装Node.JS的教程
2015/10/15 Javascript
Vue.js实现分页查询功能
2020/11/15 Javascript
nodejs中Express与Koa2对比分析
2018/02/06 NodeJs
Node.js中,在cmd界面,进入退出Node.js运行环境的方法
2018/05/12 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
jquery实现的放大镜效果示例
2020/02/24 jQuery
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
[39:18]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第二场 12.17
2020/12/19 DOTA
[41:21]夜魇凡尔赛茶话会 第三期02:看图识人
2021/03/11 DOTA
wxPython中listbox用法实例详解
2015/06/01 Python
详解python中的 is 操作符
2017/12/26 Python
python tkinter图形界面代码统计工具
2019/09/18 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
python实现猜拳游戏项目
2020/11/30 Python
利用python+request通过接口实现人员通行记录上传功能
2021/01/13 Python
params有什么用
2016/03/01 面试题
作文评语大全
2014/04/23 职场文书
参观邀请函范文
2015/02/02 职场文书
放假通知
2015/04/14 职场文书
研讨会通知
2015/04/27 职场文书
国庆节新闻稿
2015/07/17 职场文书
《绝招》教学反思
2016/02/20 职场文书
总结Python连接CS2000的详细步骤
2021/06/23 Python