这篇文章说的非常好!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. 谈谈计算机上的那些存储器-Memory Hierarchy

    文章首发于浩瀚先森博客http://www.guohao1206.com/2016/12/07/1248.html 说到计算机上的存储器,很多人第一反应是硬盘,然后是内存. 其实在计算机上除了硬盘和内 ...

  2. 《深入理解计算机系统V2》学习指导

    <深入理解计算机系统V2>学习指导 目录 图书简况 学习指导 第一章 计算机系统漫游 第二章 信息的表示和处理 第三章 程序的机器级表示 第四章 处理器体系结构 第五章 优化程序性能 第六 ...

  3. JS组件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)

    前言:前天刚写了篇JS组件系列——Bootstrap Table 表格行拖拽,今天接到新的需要,需要在之前表格行拖拽的基础上能够同时拖拽选中的多行.博主用了半天时间研究了下,效果是出来了,但是感觉不尽 ...

  4. 解决 PHPExcel 长数字串显示为科学计数

    解决 PHPExcel 长数字串显示为科学计数 在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号. ...

  5. ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法

    ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法 ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组, ...

  6. UIDynamic - 推动行为: UIPushBehavior

    用途: 从一个点移动到另外一个点; 相关属性: mode : UIPushBehaviorModeContinuous  //推移模式 angle : setAngle  //推移角度 magnitu ...

  7. 解决:error: Cannot fetch repo (TypeError: expected string or buffer)

    同步源码,问题重现: Fetching project platform/external/libopus Fetching project repo error: Cannot fetch repo ...

  8. MapReduce实现手机上网日志分析(分区)

    一.问题背景 实际业务的需要,比如以移动为例,河南的用户去了北京上网,那么他的上网信息默认保存在了北京的基站,那么我们想要查询北京地区的上网日志信息默认也包含了其他地区用户的在本区的上网信息,否则只能 ...

  9. RabbitMQ consumer的一些坑

    坑 坑就像是恶梦,总是在最不设防的时候出现,打的你满地找牙.这里记录一些坑,遇到的朋友可以及时的跳出,避免带来损失. 使用事件方式去获取queue中的消息,然后再进行处理.这看起来没什么问题,但是如果 ...

  10. js获取当前坐标

    <script type="text/javascript"> var position_option = {enableHighAccuracy: false,max ...