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高亮效果的二种实现方法
Sep 14 Javascript
火狐textarea输入法的bug的触发及解决
Jul 24 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
Jan 22 Javascript
jQuery实现商品活动倒计时
Oct 16 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
Aug 09 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
Dec 27 Javascript
原生JS实现图片左右轮播
Dec 30 Javascript
Node.js 中exports 和 module.exports 的区别
Mar 14 Javascript
基于vue.js的分页插件详解
Nov 27 Javascript
详解angular路由高亮之RouterLinkActive
Apr 28 Javascript
layui 弹出层值回传解决方式
Nov 14 Javascript
Vue.js实现立体计算器
Feb 22 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/04 新手入门
PHP中extract()函数的定义和用法
2012/08/17 PHP
Zend Framework页面缓存实例
2014/06/25 PHP
php实现Session存储到Redis
2015/11/11 PHP
php自定义分页类完整实例
2015/12/25 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
jQuery select的操作实现代码
2009/05/06 Javascript
js中设置元素class的三种方法小结
2011/08/28 Javascript
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
javascript三元运算符用法实例
2015/04/16 Javascript
JQuery中基础过滤选择器用法实例分析
2015/05/18 Javascript
jquery ajax局部加载方法详解(实现代码)
2016/05/12 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
基于Bootstrap的网页设计实例
2017/03/01 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
vue slot 在子组件中显示父组件传递的模板
2018/03/02 Javascript
Vuex 使用 v-model 配合 state的方法
2018/11/13 Javascript
vue组件之间的数据传递方法详解
2019/04/19 Javascript
Layui 解决表格异步调用后台分页的问题
2019/10/26 Javascript
Vue解析带html标签的字符串为dom的实例
2019/11/13 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
2019/12/02 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
详解Python中的strftime()方法的使用
2015/05/22 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
2019/07/11 Python
python 3.7.4 安装 opencv的教程
2019/10/10 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
如何更改 pandas dataframe 中两列的位置
2019/12/27 Python
Python随机数函数代码实例解析
2020/02/09 Python
Python使用pycharm导入pymysql教程
2020/09/16 Python
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
2014年转正工作总结
2014/11/08 职场文书
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers