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 相关文章推荐
javascript 循环读取JSON数据的代码
Jul 17 Javascript
JS实现时间格式化的方式汇总
Oct 16 Javascript
javascript eval(func())使用示例
Dec 05 Javascript
JavaScript中数组成员的添加、删除介绍
Dec 30 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
Aug 12 Javascript
Jquery on绑定的事件 触发多次实例代码
Dec 08 Javascript
JavaScript 过滤关键字
Mar 20 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
Jun 02 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
Nov 02 Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
Mar 14 Javascript
JS手写一个自定义Promise操作示例
Mar 16 Javascript
详解JS ES6编码规范
May 07 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创建Cookie数组的详解
2013/07/03 PHP
php打包压缩文件之ZipArchive方法用法分析
2016/04/30 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
$.ajax返回的JSON无法执行success的解决方法
2011/09/09 Javascript
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
用循环或if语句从json中取数据示例
2014/08/18 Javascript
JavaScript极简入门教程(一):基础篇
2014/10/25 Javascript
javascript实现数独解法
2015/03/14 Javascript
javascript判断并获取注册表中可信任站点的方法
2015/06/01 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
实现高性能JavaScript之执行与加载
2016/01/30 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
2017/12/10 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
详解vue父子组件关于模态框状态的绑定方案
2019/06/05 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
[41:52]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第二场 2月22日
2021/03/11 DOTA
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
python调用fortran模块
2016/04/08 Python
python创建列表和向列表添加元素的实现方法
2017/12/25 Python
详解Python发送email的三种方式
2018/10/18 Python
python将pandas datarame保存为txt文件的实例
2019/02/12 Python
python binascii 进制转换实例
2019/06/12 Python
Python实现动态给类和对象添加属性和方法操作示例
2020/02/29 Python
html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法
2013/01/09 HTML / CSS
美国二手奢侈品寄售网站:TheRealReal
2016/10/29 全球购物
斯洛伐克电子产品购物网站:DATART
2020/04/05 全球购物
Java基础知识面试要点
2016/07/29 面试题
关于运动会广播稿50字
2014/10/18 职场文书
三孔导游词
2015/02/05 职场文书
大学教师个人总结
2015/02/10 职场文书
公司环境卫生管理制度
2015/08/05 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis
python实现简单石头剪刀布游戏
2021/10/24 Python
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js