zoukankan      html  css  js  c++  java
  • js中this

    首先声明,我是小白,以下只是自己的简单理解。

    先看下面的代码:

    1 (function () {
    2     
    3     console.log(this);
    4 
    5 })();

    毫无疑虑,输出的是window。

    在看下面代码:

    1 (function () {
    2 
    3     function Main() {
    4         console.log(this);
    5     }
    6     new Main();
    7 })();

    当然这样返回的是Main{}。

    解释一下吧:首先说this返回的是当前对象,而在次代码中,this也就指的是,Main的这个对象了。(注意是对象)。

    接着看下面的代码:

    1 (function () {
    2 
    3     function main() {
    4         console.log(this);
    5     }
    6     main();
    7 })();

    这个结果输出的是window,是不是有点不可思议。接下来分析一下,懂原理了就明白了O(∩_∩)O哈!

    先提下new,它声明了一个对象,这个对象再去执行一个函数。拿第二个代码来说,new声明了一个对象Main{},它去执行的函数,所以这个this返回的是Main{}对象。

    如果没有new,而直接执行函数main,那么谁去执行的呢,不用说,没有对象了,这个负担就交给了window了(window:我心累啊!)

    最后提一点,第二个和第三个代码,函数名不一样,第二个代码是Main(),第一个字母是大写的,也就表明了它是构造函数。这里说的目的是,webstorm编译器会给予警告,不会报错,但看起来不爽,而且编码也不规范(对于我这强迫症患者更是痛苦啊O(≧口≦)O)

    1 (function () {
    2 
    3     var self=this;
    4     function Main() {
    5         console.log(self);
    6     }
    7     new Main();
    8 })();

    这次输出的是window,这就表明this可以传递。

    用处:当你想获取函数外部的函数的this时候可以先用一个对象变量保存this,从而传递this。(这算是一个技巧吧)

    接着"上菜"

     1 (function () {
     2 
     3     function Main() {
     4         var show = this.showThis;
     5         show.apply(this);
     6     }
     7 
     8     Main.prototype.showThis = function () {
     9         console.log(this);
    10     };
    11     new Main();
    12 })();

    结果是Main{},这段代码用了原型方法,当然this也指的是Main{}这个对象。

    prototype明天如果有时间话整理(明天又要开始培训了苦逼啊)

     补充by8.23

    今天看了会《JavaScript高级程序设计》,对this又有了些许感悟,特此几下。

    引用其中的一句话:在全局函数中,this 等于window,而当函数被作为某个对象的方法调用时,this 等于那个对象

    最重要的一句话就是,this实在针对对象来说的。 这也就解释了上面的有new和没new的区别。

    看个代码:

     1 var name = "The Window";
     2 var object = {
     3   name : "My Object",
     4   getNameFunc : function(){
     5     return function(){
     6       return this.name;
     7     };
     8   }
     9 };
    10 alert(object.getNameFunc()());

    返回的结果是window。

    这也就说明了this只往上找一级,找不到返回的就是window

    代码如果这样写的话:

    1 var name = "The Window";
    2   var object = {
    3     name : "My Object",
    4     getName: function(){
    5     return this.name;
    6   }
    7 };

    在输出object.getName();结果就是My Object

    因为这里的this找到了var声明的对象object。

    补充by8.30

    一个特别特别特别重要的知识点:

    截取部分代码:

    1  Card.prototype.addClickEvent = function () {
    2 
    3         var self = this;
    4         this._htmlNode.bind("click", function () {
    5             console.log($(this));
    6             self.showB();
    7         });
    8 
    9     };
    1 Card.prototype.addClickEvent = function () {
    2 
    3         
    4         this._htmlNode.bind("click", function () {
    5             console.log($(this));
    6             this.showB();
    7         }.bind(this));
    8 
    9     };

    这是卡片旋转的部分代码。(用的jQuery写的)

    说明,点击时候不是点击Card而是,htmlNode。

    两个代码等价。但个人认为下面的高大上。当然高富帅也是要付出代价的不容易记。

    注意一点bind里面绑定的是this,不是Card。

  • 相关阅读:
    How to add a button in the seletions "More"
    Tags Used In OpenERP 7.0
    OpenERP Web Client设置闲置有效时间
    OpenERP7.0中非admin帐号新增其它用户问题
    Docker 使用docker-compose部署项目
    Docker 安装docker-compose多容器管理服务
    Jenkins集成Docker实现镜像构建和线上发布
    Centos下安装JDK、Maven和Git
    服务注册发现与调度
    Spring boot centos部署启动停止脚本
  • 原文地址:https://www.cnblogs.com/chenluomenggongzi/p/5793759.html
Copyright © 2011-2022 走看看