关于this和self的使用说明

前两天在写一个chrome的extensions,因为 content里和background交互必需要一个异步方法实现,如:


代码如下:

var Test = new Class({
options: {},
initialize: function(args) {
chrome.extension.sendRequest({ 'type':'options' }, function(options) {
this.options = options;
……
});
}
});

这个this应该是Test这个对象,但是回调方法里是空的。难道要把this做参数传过去,再call回来?还好,mootools里有个好方法,bind。


代码如下:

var Test = new Class({
options: {},
initialize: function(args) {
chrome.extension.sendRequest({ 'type':'options' }, function(options) {
this.options = options;
……
}.bind(this));
}
});

这下OK了,继续写:


代码如下:

var Test = new Class({
options: {},
initialize: function(args) {
chrome.extension.sendRequest({ 'type':'options' }, function(options) {
this.options = options;
$each(this.options, function(o, i) {
if (o == '1') {
this.fun1();
} else {
this.fun2();
}
}.bind(this));
}.bind(this));
},
fun1: function {},
fun2: function {}
});

就算有bind也不容易分清哪个this是什么了。而真实的代码比这个要恐怖的多,有的情况下,我们的确需要this指向其它的变量,而不是这个类。
最常用的解决方法,是这样:


代码如下:

var Test = new Class({
options: {},
initialize: function(args) {
var _self = this;
chrome.extension.sendRequest({ 'type':'options' }, function(options) {
_self.options = options;
$each(_self.options, function(o, i) {
if (o == '1') {
_self.fun1();
} else {
_self.fun2();
}
});
});
},
fun1: function {},
fun2: function {}
});

我特别定义了一个_self的变量来代替this,这看起来象什么?python!
现在终于体会到python的self绝对不是多此一举。

(0)

相关推荐

  • javascript this用法小结

    this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascript中,由于 javascript的动态性(解释执行,当然也有简单的预编译过程),this的指向在运行时才确定.这个特性在给我们带来迷惑的同时也带来了编程上的 自由和灵活,结合apply(call)方法,可以使JS变得异常强大.2.变化的this 在JavaScript中,this通常指向的是我们正在执行的函数本身,或者是指向该函数所属的对象(运行时).当我们在页面中定义

  • javascript中的self和this用法小结

    一. 起因 那天用到prototype.js于是打开看看,才看几行就满头雾水,原因是对js的面向对象不是很熟悉,于是百度+google了一把,最后终于算小有收获,写此纪念一下^_^. prototype.js代码片段 代码如下:var Class = {     create: function() {         return function() {             this.initialize.apply(this , arguments);         }     }

  • 关于数据库连接池Druid使用说明

    根据综合性能,可靠性,稳定性,扩展性,易用性等因素替换成最优的数据库连接池. Druid:druid-1.0.29 数据库 Mysql.5.6.17 替换目标:替换掉C3P0,用druid来替换 替换原因: 1.性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 .hikariCP的高性能得益于最大限度的避免锁竞争. 2.druid功能最为全面,sql拦截等功能,统计数据较为全面,具有良好的扩展性. 3.综合性能,扩展性等方面,可考虑使用druid或

  • Linux 新的API signalfd、timerfd、eventfd使用说明

    三种新的fd加入linux内核的的版本: signalfd:2.6.22 timerfd:2.6.25 eventfd:2.6.22 三种fd的意义: lsignalfd 传统的处理信号的方式是注册信号处理函数:由于信号是异步发生的,要解决数据的并发访问,可重入问题.signalfd可以将信号抽象为一个文件描述符,当有信号发生时可以对其read,这样可以将信号的监听放到select.poll.epoll等监听队列中. ltimerfd 可以实现定时器的功能,将定时器抽象为文件描述符,当定时器到期

  • 基于Bootstrap的标签页组件及bootstrap-tab使用说明

    bootstrap-tab bootstrap-tab组件是对原生的bootstrap-tab组件的封装,方便开发者更方便地使用,主要包含以下功能: tab页初始化 关闭tab页 新增tab 显示tab页 获取tab页ID 使用 Step1 :引入样式 <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" rel="external nofollow" > <

  • php header 详细使用说明与使用心得第1/2页

    不管页面有多少header,它会执行最后一个,不过是有条件的,例如: header('Location:http://www.jb51.net'); header('Location:http://www.g.cn'); header('Location:http://www.baidu.com'); 这个就会跳到百度 header('Location:http://www.jb51.net');echo '我们'; header('Location:http://www.g.cn'); hea

  • C#中yield用法使用说明

    在迭代器块中用于向枚举数对象提供值或发出迭代结束信号.它的形式为下列之一: yield return <expression>; yield break; 备注: 计算表达式并以枚举数对象值的形式返回:expression 必须可以隐式转换为迭代器的 yield 类型. yield 语句只能出现在 iterator 块中,该块可用作方法.运算符或访问器的体.这类方法.运算符或访问器的体受以下约束的控制:不允许不安全块. 方法.运算符或访问器的参数不能是 ref 或 out. yield 语句不

  • php header()函数使用说明

    header()函数使用说明: 一.作用:   ~~~~~~~~~          PHP只是以HTTP协议将HTML文档的标头送到浏览器,告诉浏览器具体怎么处理这个页面,至于传送的内容则需要熟悉一下HTTP协议了,与PHP无关了,可参照http://www.w3.org/Protocols/rfc2616/rfc2616.          传统的标头一定包含下面三种标头之一,并只能出现一次.          Location:  xxxx:yyyy/zzzz          Conte

  • 浅析Linux系统下安装wetty和使用说明

    以下内容从wetty简介.环境准备.wetty安装.以及验证方面给大家分析,具体详情请看下文吧. 1. Wetty简介 Wetty是使用Node.js和websockets开发的一个开源Web-based SSH.关于Web-based SSH的更多资料请参考https://en.wikipedia.org/wiki/Web-based_SSH. 而wetty的资料请参考https://github.com/krishnasrinivas/wetty. 2. 环境准备 因为wetty是使用Nod

  • Async Validator 异步验证使用说明

    async-validator 是一个异步验证的库,需要传入要验证的数据和验证规则 官方链接 https://github.com/yiminghe/async-validator 要检验的数据,格式要求如下: { a:xxx, b:xxx } 检验规则定义格式如下: { a:[ {验证规则, message: 'xxx'}, {验证规则, message: 'xxx'} ], b:[ {验证规则, message: 'xxx'} ] } message是规则没通过时返回的错误消息 举个例子,

  • diskcopy 命令使用说明

    Diskcopy命令使用说明 我们已经学过复制文件,但你们知道磁盘也可以复制吗?好,这节就讲这个东东,diskcopy,翻译成中文就是磁盘复制.所谓复制磁盘就是复制出一个和原来磁盘内容一模一样的磁盘,其实和复制文件也差不多. diskcopy命令的格式很简单: diskcopy 源驱动器名 目的驱动器名 .举个例子来说,如果要在A驱动器上复制磁盘,就输入: diskcopy a: a: (奇怪吧,哪来两个A盘,且看下文电脑是如何理解的). 输入 diskcopy a: a: 命令后回车,电脑提示

  • linux ar 命令的使用说明和实例讲解

    ar命令可以用来创建.修改库,也可以从库中提出单个模块.库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member).原始文件的内容.模式.时间戳 .属主.组等属性都保留在库文件中. ar可让您集合许多文件,成为单一的备存文件.在备存文件中,所有成员文件皆保有原来的属性与权限. 用途说明 创建静态库.a文件.用C/C++开发程序时经常用到,但我很少单独在命令行中使用ar命令,一般写在makefile中,有时也会在shell脚 本中用到.关于Linux下的库文件

随机推荐