AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > JavaScript

JS作用域闭包、预解释和this关键字综合实例解析

51自学网 http://www.wanshiok.com
JS,作用域,闭包,预解释,this关键字

本文实例分析了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排序算法总结》、《Javascript遍历算法与技巧总结》、《Javascript数学运算用法总结》、《Javascript数据结构与算法技巧总结》、《Javascript查找算法技巧总结》及《Javascript错误与调试技巧总结

希望本文所述对大家Javascript程序设计有所帮助。


JS,作用域,闭包,预解释,this关键字  
上一篇:详解如何较好的使用js  下一篇:详解js的事件处理函数和动态创建html标记方法