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

先看下面的代码:

 (function () {

     console.log(this);

 })();

毫无疑虑,输出的是window。

在看下面代码:

 (function () {

     function Main() {
console.log(this);
}
new Main();
})();

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

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

接着看下面的代码:

 (function () {

     function main() {
console.log(this);
}
main();
})();

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

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

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

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

 (function () {

     var self=this;
function Main() {
console.log(self);
}
new Main();
})();

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

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

接着"上菜"

 (function () {

     function Main() {
var show = this.showThis;
show.apply(this);
} Main.prototype.showThis = function () {
console.log(this);
};
new Main();
})();

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

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

补充by8.23

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

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

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

看个代码:

 var name = "The Window";
var object = {
  name : "My Object",
  getNameFunc : function(){
    return function(){
      return this.name;
    };
  }
};
alert(object.getNameFunc()());

返回的结果是window。

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

代码如果这样写的话:

 var name = "The Window";
  var object = {
    name : "My Object",
    getName: function(){
    return this.name;
  }
};

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

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

补充by8.30

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

截取部分代码:

  Card.prototype.addClickEvent = function () {

         var self = this;
this._htmlNode.bind("click", function () {
console.log($(this));
self.showB();
}); };
 Card.prototype.addClickEvent = function () {

         this._htmlNode.bind("click", function () {
console.log($(this));
this.showB();
}.bind(this)); };

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

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

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

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

js中this的更多相关文章

  1. 5.0 JS中引用类型介绍

    其实,在前面的"js的六大数据类型"文章中稍微说了一下引用类型.前面我们说到js中有六大数据类型(五种基本数据类型 + 一种引用类型).下面的章节中,我们将详细讲解引用类型. 1. ...

  2. 【repost】JS中的异常处理方法分享

    我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...

  3. JS中给正则表达式加变量

    前不久同事询问我js里面怎么给正则中添加变量的问题,遂写篇博客记录下.   一.字面量 其实当我们定义一个字符串,一个数组,一个对象等等的时候,我们习惯用字面量来定义,例如: var s = &quo ...

  4. js中几种实用的跨域方法原理详解(转)

    今天研究js跨域问题的时候发现一篇好博,非常详细地讲解了js几种跨域方法的原理,特分享一下. 原博地址:http://www.cnblogs.com/2050/p/3191744.html 下面正文开 ...

  5. 关于js中的this

    关于js中的this this是javascript中一个很特别的关键字,也是一种很复杂的机制,学习this的第一步就是要明白this既不指向函数自身也不指向函数的词法作用域,this实际上是函数被调 ...

  6. 表值函数与JS中split()的联系

    在公司用云平台做开发就是麻烦 ,做了很多功能或者有些收获,都没办法写博客,结果回家了自己要把大脑里面记住的写出来. split()这个函数我们并不陌生,但是当前台有许多字段然后随意勾选后的这些参数传递 ...

  7. JS中 call() 与apply 方法

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  8. 在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查

    Sequelize是一个基于promise的关系型数据库ORM框架,这个库完全采用JavaScript开发并且能够用在Node.JS环境中,易于使用,支持多SQL方言(dialect),.它当前支持M ...

  9. 分析js中的constructor 和prototype

    在javascript的使用过程中,constructor 和prototype这两个概念是相当重要的,深入的理解这两个概念对理解js的一些核心概念非常的重要. 我们在定义函数的时候,函数定义的时候函 ...

  10. 如何在Node.js中合并两个复杂对象

    通常情况下,在Node.js中我们可以通过underscore的extend或者lodash的merge来合并两个对象,但是对于像下面这种复杂的对象,要如何来应对呢? 例如我有以下两个object: ...

随机推荐

  1. GPS基础知识

    GPS基础知识 冷启动 冷启动是指模块内部没有任何参的星历或历书的情况下,模块的首次启动,一般而言,由于模块内部没有星历参数,这个时候接收卫星信号开始,就要在天线接收的范围内不停的寻找并下载星历,它的 ...

  2. 动态添加select的option

    动态给select标签添加option,结合前人经验以及自己经验,现在总结三种方法供大家参考,一起交流学习! 首先是定义的select元素: //根据ID获得select元素var mySelect ...

  3. hd acm 1465

    问题:某人写了n封信和n个信封,如果所有的信都装错了信封.求所有的信都装错信封,共有多少种不同情况. 思路:由这道题引入错排公式:f(n)=(n-1)*[f(n-1)+f(n-2)]. 当N=1和2时 ...

  4. poj 1019 Number Sequence 【组合数学+数字x的位宽函数】

    题目地址:http://poj.org/problem?id=1019 Number Sequence Time Limit: 1000MS   Memory Limit: 10000K Total ...

  5. hdu 1701 (Binary Tree Traversals)(二叉树前序中序推后序)

                                                                                Binary Tree Traversals T ...

  6. Idea 使用过程中遇到的问题记录

    1.在Idea启动Tomcat,有时候提示项目启动 failed,请查看日志,此时的日志在Tomcat主目录的日志文件中是没有的,此时的日志记录在: C:\Users\wanhua.lu\.Intel ...

  7. scala基本学习

    def addOne(f: Int => Int, arg: Int) = f(arg) + 1,意思是 addOne要两个参数一个是:传一个整数的参数且返回一个整形的方法的参数,第二个参数就是 ...

  8. Linux- AWS之EC2大数据集群定时开关机

    众所周知,云计算就是在计算你的钱,每当ec2开起来就要开始计费.当用户购买了一个庞大的与服务器做一个集群,尤其是用来做大数据集群,这些服务器的配置相当高,每台服务器所需要的费用不菲.其实在很多时候没能 ...

  9. HTML5 学习记录——2

    20150826 1.声明文档类型 <!DOCTYPE>  声明HTML是用什么版本写的. 常用声明; 2.HYML头部元素   <head> <title> 定义 ...

  10. Git教程(二)-如何上传和同步自己的git项目

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! Git接触并使用多年, 工作中使用较多,它的分布式存储,使每个人的电脑均为服务器的策略非常棒:再加上 ...