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 相关文章推荐
javascipt基础内容--需要注意的细节
Apr 10 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
May 10 Javascript
jQuery实现隔行背景色变色
Nov 24 Javascript
JavaScript中实现依赖注入的思路分享
Jan 15 Javascript
Jquery中find与each方法用法实例
Feb 04 Javascript
浅谈EasyUI中Treegrid节点的删除
Mar 01 Javascript
JavaScript中5种调用函数的方法
Mar 12 Javascript
深入分析jsonp协议原理
Sep 26 Javascript
jquery实现图片预加载
Dec 25 Javascript
JQuery实现网页右侧随动广告特效
Jan 17 Javascript
jQuery事件用法详解
Oct 06 Javascript
微信小程序 Flex布局详解
Oct 09 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
Zend Framework 2.0事件管理器(The EventManager)入门教程
2014/08/11 PHP
WordPress中用于创建以及获取侧边栏的PHP函数讲解
2015/12/29 PHP
php判断目录存在的简单方法
2019/09/26 PHP
laravel解决迁移文件一次删除创建字段报错的问题
2019/10/24 PHP
基于jquery的监控数据是否发生改变
2011/04/11 Javascript
浅谈Javascript事件模拟
2012/06/27 Javascript
JS、CSS以及img对DOMContentLoaded事件的影响
2014/08/12 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
简述jQuery ajax的执行顺序
2016/01/05 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
JS闭包与延迟求值用法示例
2016/12/22 Javascript
微信小程序 扎金花简单实例
2017/02/21 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新
2019/05/14 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
[15:46]教你分分钟做大人——沙王
2015/03/11 DOTA
详解Python Socket网络编程
2016/01/05 Python
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Python叠加两幅栅格图像的实现方法
2019/07/05 Python
深入了解python中元类的相关知识
2019/08/29 Python
python解析yaml文件过程详解
2019/08/30 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
2020/06/02 Python
基于Python爬取素材网站音频文件
2020/10/21 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
2021/01/28 Python
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
中餐厅经理岗位职责
2014/04/11 职场文书
工商管理专业毕业生求职信
2014/05/26 职场文书
个人原因辞职信模板
2015/05/13 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书
私人贷款担保书该怎么写呢?
2019/07/02 职场文书
掌握这项技巧,一年阅读300本书不是梦
2019/09/12 职场文书