这篇文章说的非常好!http://my.oschina.net/blogshi/blog/265415

我的体会就是,函数中的this,指的是运行时,它是被哪个对象调用的。因为javascrpit的函数是一个对象,自然就可以脱离定义它的对象单独使用,脱离之后,函数中的this就会改变,这个问题是javascript最常见的问题,所以出了好多解决方法,比如call函数,apply函数,bind函数等等。而bind函数的返回值是一个函数,这个返回的函数的this被指定为定义时的this,不再因为调用者的不同而改变成不同的this。

在面向对象语言中this的使用很简单,比如java,objective-c,这是因为类中的方法从不能脱离类而单独使用,而且实例方法必须通过这个类的实例去调用,这就保证了this定义的一致性。而js不同,它里面的函数完全可以独立调用,而且可以在函数内部随意使用this指针,没有编译环节,自然也不会报错,但是真正运行的时候,就会因为this指向的内容根本不是打算指向的内容而出bug。

this在同一个function作用域内肯定是同一个值,而如果再嵌套一层,就很可能改变了。这里引用一句别人的总结:函数嵌套产生的内部函数的this不是其父函数,仍然是全局对象。比如下面这段代码:

  <TabBarIOS.Item
title="公告"
icon={require('image!gonggao') }
selected={this.state.selectedTab === 'message'}
onPress={ (function () { this._selectTab('message'); var that = this; var path = Service.host + Service.getMessage;
//fetch message from server
Util.post(path, {
key: Util.key
}, function (data) {
console.log('got data from internet-----------------------data is ' + data);
console.log('this is'+this);
console.log('that is'+that); that.setState({
date:data,
});
console.log('got data from internet end-----------------------data is ' + data); }); }.bind(this))
}
>

上面这段代码有3个this,第一个是TabBarIOS.Item外边render函数(这里没有写出来)的this,第二个和第三个分别对应2个function作用域,为了实现能够调用到最外边的this,第一个function使用了bind方法,第二个function使用了重新定义变量的方法。

再理解一下bind方法:

bind方法会创建一个新函数,称为绑定函数.当调用这个绑定函数时,绑定函数会以创建它时传入bind方法的第一个参数作为this,传入bind方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数.

这句话就是说

(function(data) {
somecode here.....
}).bind(this)

上边这段代码返回的是一个函数,这个函数接收一个参数。

(function(data) {
    somecode here.....

}).bind(this,realData)

上边这段代码返回的是一个函数,这个函数不需要参数,因为原函数的第一个参数已经被赋值为realData了。

javascript 中的 bind (编辑中。。。。)的更多相关文章

  1. 在VS解决方案资源管理器中自动定位当前编辑中的文件

    依次点击 [工具]- [选项] - [项目和解决方案]-[常规]- 勾选[在解决方案资源管理器中跟踪活动项]

  2. 把玩Javascript中的bind

    前言 今天闲着无聊随便逛了逛MDN,忽而看到一个方法Function.prototype.bind(),突然发现除了使用这个方法之外都没有仔细琢磨过这个方法.于是乎,找到了kill time的事情-写 ...

  3. Javascript中的bind详解

    前言 用过React的同学都知道,经常会使用bind来绑定this. import React, { Component } from 'react'; class TodoItem extends ...

  4. JavaScript中的bind,call和apply函数的用法和区别

    一直没怎么使用过JavaScript中的bind,call和apply, 今天看到一篇比较好的文章,觉得讲的比较透彻,所以记录和总结如下 首先要理解的第一个概念,JavaScript中函数调用的方式, ...

  5. Javascript中的bind()函数

    今天看到公司大神的一段代码: function ReplaceProcessor() { this._dom = { btnReplace: $('#ro_btnReplace'), btnCompl ...

  6. 浅谈Jquery中的bind(),live(),delegate(),on()绑定事件方式

    前言 因为项目中经常会有利用jquery操作dom元素的增删操作,所以会涉及到dom元素的绑定事件方式,简单的归纳一下bind,live,delegate,on的区别,以便以后查阅,也希望该文章日后能 ...

  7. jQuery中的bind() live() delegate()之间区别分析

    jQuery中的bind() live() delegate()之间区别分析 首先,你得要了解我们的事件冒泡(事件传播)的概念,我先看一张图 1.bind方式 $('a').bind('click', ...

  8. JS中的bind的实现以及使用

    在讨论bind()方法之前我们先来看一道题目: var altwrite = document.write; altwrite("hello"); //1.以上代码有什么问题 // ...

  9. 规避 React 组件中的 bind(this)

    React 组件中处理 onClick 类似事件绑定的时候,是需要显式给处理器绑定上下文(context)的,这一度使代码变得冗余和难看. 请看如下的示例: class App extends Com ...

  10. JavaScript权威指南--WEB浏览器中的javascript

    知识要点 1.客户端javascript window对象是所有客户端javascript特性和API的主要接入点.它表示web浏览器的一个窗口或窗体,并且可以用window表示来引用它.window ...

随机推荐

  1. 阅读ArrayBlockingQueue源码了解如何利用锁实现BlockingQueue

    BlockingQueue是多线程里面一个非常重要的数据结构.在面试的时候,也常会被问到怎么实现BlockingQueue.本篇根据Java7里ArrayBlockingQueue的源码,简单介绍一下 ...

  2. 万能的林萧说:我来告诉你,一个草根程序员如何进入BAT。

    引言 首先声明,不要再问LZ谁是林萧,林萧就是某著名程序员小说的主角名字. 写这篇文章的目的其实很简单,算是对之前LZ一篇文章的补充和完善. 之前LZ写过一篇<回答阿里社招面试如何准备,顺便谈谈 ...

  3. Codeforces Round #381(div 2)

    A.(分类讨论) 题意:你有n本书,有三种买书方案,花a元买1本,花b元买2本,花c元买3本,问最少花多少钱,使得你书的总数是4的倍数 分析:分类讨论的题,但是要注意你可以买超过4本书--可以买5本. ...

  4. C 语言学习 第二次作业总结

    本次作业内容,主要有以下几点: 新建 coding 帐号,且使用 coding 上传本次作业的代码 Printf及条件判断语句的使用 作业总结 作业总结: 同学们开始渐入佳境,能够较为流畅的写出合理的 ...

  5. Ubuntu 14.04 无线网卡驱动安装

    安装了Ubuntu最新版本 14.04 之后,发现无线网卡不能使用,偿试安装驱动后,问题解决. 首先确定无线网卡类型: lspci -vnn -d 14e4: 比如我的网卡类型为 06:00.0 Ne ...

  6. JAVA 技术手册 卷1 第十四章『多线程』 读书摘要

    什么是线程 进程受CPU时间片的轮转调度,进而予人多任务并发的感觉. 线程在更低层次上扩展多任务概念,一个进程通常包含多个线程. 进程各自数据独立,而线程共享数据. 数据独立使进程相互通信变得繁难,共 ...

  7. Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)

    题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m 不妨令n<=m 首先把lcm(i,j)转成i*j/gcd(i,j) 正解不会...总之最后化出来的 ...

  8. Angular.js通过bootstrap实现经典的表单提交

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link rel= ...

  9. 创建一个自定义颜色IRgbColor

    后续文章需要用到,很简单的一个小函数 /// <summary> /// 自定义颜色 /// </summary> /// <param name="r&quo ...

  10. python中的IO多路复用

    在python的网络编程里,socetserver是个重要的内置模块,其在内部其实就是利用了I/O多路复用.多线程和多进程技术,实现了并发通信.与多进程和多线程相比,I/O多路复用的系统开销小,系统不 ...