分享

学习网上闭包的小总结-2013-4-11

 Freedom Gundam 2013-04-11
刚才理解了javascript作用域以后,再去理解javascript闭包
从网上找到一篇比较关于闭包的学习,链接如下
学习javascript闭包
看了这篇文章之后,对闭包和作用域的理解更进一步,也对这篇文章最后2个例子的学习作了一次总结
以下是个人对那2个例子的理解
var name = "The Window";
  var object = {
    name : "My Object",

    getNameFunc : function(){
      return function(){
        return this.name;
      };
    }
  };

alert(object.getNameFunc()());        //结果是The Window
/*以下是个人理解:
首先object.getNameFunc()()这一句要分解一下比较好理解
因为后面是2个(),所以有2个动作,第一个括号执行完以后
是返回一个方法,此时这个返回的方法还没有执行,经过第二个
括号以后才执行返回的方法,此时调用这个方法的对象已经是window
所以里面的this是window

网上的解释很精炼:
var tmp = Object.getNameFunc(); //此时没有执行this.name
var name = tmp();//这个时候才执行,这时候的this上下文为全局
*/


var name = "The Window";

  var object = {
    name : "My Object",

    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };

    }

  };

alert(object.getNameFunc()());        //结果是My Object
/*和上面的理解一样,第一个括号执行后返回一个方法
在执行第一个括号过程中:
var that = this
此时的this是object,然后传给that再放入返回函数中
第二个括号执行的时候很显然返回的是object.name

网上的解释:
var tmp = Object.getNameFunc(); //这个时候执行了that = this,这里的this上下文是object,所以that指的是object
var name = Object.getNameFunc(); //这个时候执行了that.name
*/

//这是另外一个例子
var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
return (this.name);
      }
  };
var name = object.getNameFunc();
alert(name);          
/*这里比较好理解,倒数第二句重新定义了name覆盖了第一行的定义的name
所以最后一句执行结果是My Object
*/

2013-06-07下午,在网上看到一篇总结,对于this的理解增进一步
这个是链接:点击
this关键字引用的是包含它的函数作为某个对象的方法被调用时的那个对象。———《JavaScript.Dom高级程序设计》
这句话比较好理解,就不写出例子了

对于下面这段话就有点不同了
和变量不同,关键字this没有作用域的限制,嵌套的函数不会从调用它的函数中继承this。 如果嵌套函数作为方法调用,其this值指向调用它的对象。 如果嵌套函数作为函数调用,其this值不是全局对象(非严格模式下)就是undefined(严格模式下)。———— 《JavaScript权威指南》
代码:
  1. var other = {
  2.      "showThis" : function(){
  3.          console.log(this);
  4.      }
  5. };

  6. function doit(fn) {
  7.      fn();
  8. }
  9. doit(other.showThis);   

此时的this指向window

在第10行当中,other把方法showThis作为参数传递给了doit函数,在javascript中参数是按值传递的,在fn()执行时,它不再作为other对象的方法,所以这里this关键字指向了window;如果想访问外部函数的this值,可以将this的值保存在一个变量里。

var other = {
     "say" : function(){
         alert("hello world");
     },
     "bind":function(){
         document.onclick = function(){
             this.say();  //出错
         }
     }
 };
 other.bind();

上面的代码会出错,因为onclick事件处理程序是作为DOM元素的方法的,this关键字指向了document。 稍微改一下:

var other = {
     "say" : function(){
         alert("hello world");
     },
     "bind":function(){
         var self = this;
         document.onclick = function(){
             self.say();   //"hello world"
         }
     }
 };
 other.bind();

在bind()里将this关键字存至self变量, bind()的内部函数就可以通过self访问this。


最后再增加一个关于闭包的链接
理解javascript闭包,,,- -不过这篇好复杂,要慢慢研究···

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多