这篇文章说的非常好!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. FineUI小技巧(6)自定义页面回发

    前言 FineUI中的绝大部分回发事件都是由控件触发了,比如按钮的点击事件,下拉列表的改变事件,表格的排序分页事件.但有时我们可能会要自己触发页面回发,这时就要知道怎么使用 JavaScript 来做 ...

  2. Winform开发:在ProgressBar显示百分比数字

    如果不使用Label而是直接在进度条上显示文字,可以扩展一个派生类自己画,代码如下: public partial class Form1 : Form { public Form1() { Init ...

  3. jquery-leonaScroll-1.2-自定义滚动条插件

    leonaScroll-1.2.js 下载链接地址:http://share.weiyun.com/bb531dd6b1916c0023c176897182dc15 (密码:iZck)[内含压缩版] ...

  4. BeautifulSoup 的用法

    转自:http://cuiqingcai.com/1319.html Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python ...

  5. lambda与常用内置函数

    lambda表达式: lambda arg:arg+1 数值操作: abs() 求绝对值 abs(-1) bin() 将十进制转换成二进制   bin(3) ,’0b11’ hex() 十进制转换为十 ...

  6. 解析 XML

    解析 XML 文档: 下面的代码片段把 XML 文档解析到 XML DOM 对象中: if (window.XMLHttpRequest){// code for IE7+, Firefox, Chr ...

  7. Mvc中域的添加和不同域之间的跳转

    一.在新添加的域中中的 AreaRegistration中作如下设置: 二.在原来的Global.asax中设置: 三.不同域之间的跳转 @Url.Action("Index", ...

  8. 重写保存按钮save事件

    _saveActionEventHandler:function(event,value){ if (!_self.fireEvent("saveBefore")) return; ...

  9. spring-事务管理

    一个数据库事务是一个被视为单一的工作单元的操作序列.这些操作应该要么完整地执行,要么完全不执行.事务管理是一个重要组成部分,RDBMS 面向企业应用程序,以确保数据完整性和一致性.事务的概念可以描述为 ...

  10. CSS之A标签

    a标签,超级链接 a是英语anchor锚的意思. a标签常用的就是三个属性: 1        <a href="网址" title="悬停文本" tar ...