js中this
首先声明,我是小白,以下只是自己的简单理解。
先看下面的代码:
(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的更多相关文章
- 5.0 JS中引用类型介绍
其实,在前面的"js的六大数据类型"文章中稍微说了一下引用类型.前面我们说到js中有六大数据类型(五种基本数据类型 + 一种引用类型).下面的章节中,我们将详细讲解引用类型. 1. ...
- 【repost】JS中的异常处理方法分享
我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...
- JS中给正则表达式加变量
前不久同事询问我js里面怎么给正则中添加变量的问题,遂写篇博客记录下. 一.字面量 其实当我们定义一个字符串,一个数组,一个对象等等的时候,我们习惯用字面量来定义,例如: var s = &quo ...
- js中几种实用的跨域方法原理详解(转)
今天研究js跨域问题的时候发现一篇好博,非常详细地讲解了js几种跨域方法的原理,特分享一下. 原博地址:http://www.cnblogs.com/2050/p/3191744.html 下面正文开 ...
- 关于js中的this
关于js中的this this是javascript中一个很特别的关键字,也是一种很复杂的机制,学习this的第一步就是要明白this既不指向函数自身也不指向函数的词法作用域,this实际上是函数被调 ...
- 表值函数与JS中split()的联系
在公司用云平台做开发就是麻烦 ,做了很多功能或者有些收获,都没办法写博客,结果回家了自己要把大脑里面记住的写出来. split()这个函数我们并不陌生,但是当前台有许多字段然后随意勾选后的这些参数传递 ...
- JS中 call() 与apply 方法
1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...
- 在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查
Sequelize是一个基于promise的关系型数据库ORM框架,这个库完全采用JavaScript开发并且能够用在Node.JS环境中,易于使用,支持多SQL方言(dialect),.它当前支持M ...
- 分析js中的constructor 和prototype
在javascript的使用过程中,constructor 和prototype这两个概念是相当重要的,深入的理解这两个概念对理解js的一些核心概念非常的重要. 我们在定义函数的时候,函数定义的时候函 ...
- 如何在Node.js中合并两个复杂对象
通常情况下,在Node.js中我们可以通过underscore的extend或者lodash的merge来合并两个对象,但是对于像下面这种复杂的对象,要如何来应对呢? 例如我有以下两个object: ...
随机推荐
- 我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(三)Android客户端功能实现
我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端(地址:http://blog.csdn.net/ouyang_pen ...
- scikit-learn(project中用的相对较多的模型介绍):1.14. Semi-Supervised
參考:http://scikit-learn.org/stable/modules/label_propagation.html The semi-supervised estimators insk ...
- mysql 中 all any some 用法
-- 建表语句 CREATE TABLE score( id INT PRIMARY KEY AUTO_INCREMENT, NAME ), SUBJECT ), score INT); -- 添加数 ...
- Ubuntu安装教程
http://www.linuxdiyf.com/linux/13198.html 简易配置说明 磁盘分区,新分区的磁盘必须是未分配的, 到管理-磁盘管理下面查看磁盘是不是未分配的,如果已分配了,在磁 ...
- iOS UIImage 拉伸问题 (适用于UIButton等需要局部拉伸的情况)
图片 有的切图切很大 还占用ipa大小,有时候 切图 只需要 局部或者说 一个压缩的图片的抽象状态 直接上代码 CGFloat top = ; // 顶端盖高度 ; // 底端盖高度 ; // 左端盖 ...
- php 实现简单抽奖
首先有一组数据,里面有中奖的物品和概率 $base_data = [ ['name'=>'特等奖','num'=>1], ['name'=>'一等奖','num'=>5], [ ...
- grep egrep
grep: Global search REgular expression and Print out the line. 作用: 文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查:打 ...
- Kuhn-Munkres算法 (剪辑)(备用)
KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转化为求完备匹配的问题的. 设顶点Xi的顶标为A[i],顶点Yi的顶标为B[i],顶点Xi与Yj之间的边权为w[i,j]. 在算法执行 ...
- Spring Boot -- actuator
Spring Boot有四大神器,分别是auto-configuration.starters.cli.actuator,本文主要讲actuator.actuator是spring boot提供的对应 ...
- hdu-1025 Constructing Roads In JGShining's Kingdom(二分查找)
题目链接: Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others) Memory Li ...