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 相关文章推荐
解决AJAX中跨域访问出现'没有权限'的错误
Aug 20 Javascript
对 lightbox JS 图片控件进行了一下改造, 使其他支持复杂的图片说明
Mar 20 Javascript
jquery each()源代码
Feb 14 Javascript
JQuery+DIV自定义滚动条样式的具体实现
Jun 25 Javascript
jQuery循环动画与获取组件尺寸的方法
Feb 02 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
Nov 24 Javascript
Vue.JS入门教程之列表渲染
Dec 01 Javascript
详解JS获取HTML DOM元素的8种方法
Jun 17 Javascript
Vue面试题及Vue知识点整理
Oct 07 Javascript
vue-router命名路由和编程式路由传参讲解
Jan 19 Javascript
Vue 一键清空表单的实现方法
Feb 07 Javascript
关于uniApp editor微信滑动问题
Jan 15 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 保留字列表
2012/10/04 PHP
php随机显示图片的简单示例
2014/02/15 PHP
PHP中array_slice函数用法实例详解
2014/11/25 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
使用PHP开发留言板功能
2019/11/19 PHP
js onpropertychange输入框 事件获取属性
2009/03/26 Javascript
jQuery 锚点跳转滚动条平滑滚动一句话代码
2010/04/30 Javascript
jquery给图片添加鼠标经过时的边框效果
2013/11/12 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
深入理解JavaScript 参数按值传递
2017/05/24 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
JavaScript中click和onclick本质区别与用法分析
2018/06/07 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
微信小程序时间戳转日期的详解
2019/04/30 Javascript
js简单实现自动生成表格功能示例
2020/06/02 Javascript
python操作mysql数据库
2017/03/05 Python
用Python下载一个网页保存为本地的HTML文件实例
2018/05/21 Python
更新修改后的Python模块方法
2019/03/03 Python
Python实现的企业粉丝抽奖功能示例
2019/07/26 Python
django xadmin 管理器常用显示设置方式
2020/03/11 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
浅析HTML5 Landmark
2020/09/11 HTML / CSS
蔻驰法国官网:COACH法国
2018/11/14 全球购物
印尼第一大家居、生活和家具电子商务:Ruparupa
2019/11/25 全球购物
与UNIX有关的几个名词
2015/09/17 面试题
仓库管理专业个人自我评价范文
2013/11/11 职场文书
水污染治理专业毕业生推荐信
2013/11/14 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
礼仪培训心得体会
2016/01/22 职场文书
React如何创建组件
2021/06/27 Javascript
vue实力踩坑之push当前页无效
2022/04/10 Vue.js
Ruby GDBM操作简介及数据存储原理
2022/04/19 Ruby