码迷,mamicode.com
首页 > 其他好文 > 详细

var与this,{}与function 小记

时间:2016-04-28 00:23:12      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

JavaScript var是用来定义一个变量,this常用来定义或调用一个属性或方法。但是在全局范围内,this和var定义变量是等价的。

window

 console.log(‘window:‘, name);
 var name = ‘stone‘;
 this.name = ‘niqiu‘;
 console.log(‘var:‘,name);
 console.log(‘this:‘,this.name);

技术分享

 window对象有name属性,初始值为空,但第一个console的时候怎么获取值了呢。 发现这个window记录的是上次的值。重新打开页面,只执行 console.log(‘window:‘, name); 输出为空。 

  console.log(‘window:‘, name);
  var name = ‘stone‘;

刷新两次后输出stone. 所以window对象在刷新的时候并没有重新创建。window是的{}对象。没有构造函数,不能new。

技术分享

function与{}

在函数内部,var定义的是局部变量,而this定义的是属性。这两者没有覆盖。但新创建的对象是无法获取到局部变量的。

     var Fool = function () {
            var name = ‘stone‘;
            var nikename = ‘stoneniqiu‘;
            this.name = ‘niqiu‘;
            this.getName = function () {
                console.log(‘var‘, name);
                console.log(‘this‘, this.name);
            };
            this.getNickname = function() {
                return nikename;
            };
        };
    console.log(f.name); //niqiu
    console.log(f.nikename);//undefined
    console.log(f.getNickname());//stoneniqiu

但是如果使用{}定义对象,内部变量等于全部都是属性。

  var block = {
            name: ‘stone‘,
            nickname:‘stoneniqiu‘,
            getName: function () {
                // return this.name;//stone
                return name; //‘windows name‘;
            },
            getNickname:function() {
                return this.nickname;
            },
            printAllName:function() {
                console.log(this.getNickname());
                console.log(this.getName());
            }

        };

       console.log(block.name);//stone
       console.log(block.getName()); //windows name

像window对象一样,{}创建的对象不能new,因为没有构造函数。

技术分享

所以如果对象复用,比较大,还是用function的形式比较好,分开私有变量和公共属性或方法,function的内部模块可以用{}的形式。

通过this可取得它们所属的上下文的方法称为公共方法。this到对象的绑定发生在调用的时候,这个“超级”延迟绑定使得函数可以对this高度复用。

 this指的是当前执行的对象,为避免this发生变化。常用一个变量暂存一下this。

var self=this 

神奇的回调

下面看个例子,对象的参数中定义了回调方法,但我们传入Fool自身的一个方法,居然执行了。

 var Fool = function (config) {
           var parmas = {
               callback: function() {
                   console.log(‘raw callback‘);
               }
           };
           parmas = $.extend(parmas, config);

           var name = ‘stone‘;
           var nikename = ‘stoneniqiu‘;
           this.name = ‘niqiu‘;
           this.getName = function () {
               console.log(‘var‘, name);
               console.log(‘this‘, this.name);
           };
           this.getNickname = function () {
               return nikename;
           };
           this.doSomething = function () {
               parmas.callback();
           };
       };
       var f = new Fool({callback:function() {
           $("#bt").click(function() {
               f.getName()
           });
       }});

       f.doSomething();

运行无误,点击button 触发getName方法。但如果直接下面这样写,就会报错了,这错的很符合常理。

 var f = new Fool({callback:f.getName()});

技术分享

 再修改下,用匿名函数包起来,也能跑。

var f = new Fool({callback:function() {
             (function() {
               f.getName();
            })();
       }});
       f.doSomething();

 Why?

 

 

var与this,{}与function 小记

标签:

原文地址:http://www.cnblogs.com/stoneniqiu/p/5440833.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!