javascript 中的 bind (编辑中。。。。)
这篇文章说的非常好!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 (编辑中。。。。)的更多相关文章
- 在VS解决方案资源管理器中自动定位当前编辑中的文件
依次点击 [工具]- [选项] - [项目和解决方案]-[常规]- 勾选[在解决方案资源管理器中跟踪活动项]
- 把玩Javascript中的bind
前言 今天闲着无聊随便逛了逛MDN,忽而看到一个方法Function.prototype.bind(),突然发现除了使用这个方法之外都没有仔细琢磨过这个方法.于是乎,找到了kill time的事情-写 ...
- Javascript中的bind详解
前言 用过React的同学都知道,经常会使用bind来绑定this. import React, { Component } from 'react'; class TodoItem extends ...
- JavaScript中的bind,call和apply函数的用法和区别
一直没怎么使用过JavaScript中的bind,call和apply, 今天看到一篇比较好的文章,觉得讲的比较透彻,所以记录和总结如下 首先要理解的第一个概念,JavaScript中函数调用的方式, ...
- Javascript中的bind()函数
今天看到公司大神的一段代码: function ReplaceProcessor() { this._dom = { btnReplace: $('#ro_btnReplace'), btnCompl ...
- 浅谈Jquery中的bind(),live(),delegate(),on()绑定事件方式
前言 因为项目中经常会有利用jquery操作dom元素的增删操作,所以会涉及到dom元素的绑定事件方式,简单的归纳一下bind,live,delegate,on的区别,以便以后查阅,也希望该文章日后能 ...
- jQuery中的bind() live() delegate()之间区别分析
jQuery中的bind() live() delegate()之间区别分析 首先,你得要了解我们的事件冒泡(事件传播)的概念,我先看一张图 1.bind方式 $('a').bind('click', ...
- JS中的bind的实现以及使用
在讨论bind()方法之前我们先来看一道题目: var altwrite = document.write; altwrite("hello"); //1.以上代码有什么问题 // ...
- 规避 React 组件中的 bind(this)
React 组件中处理 onClick 类似事件绑定的时候,是需要显式给处理器绑定上下文(context)的,这一度使代码变得冗余和难看. 请看如下的示例: class App extends Com ...
- JavaScript权威指南--WEB浏览器中的javascript
知识要点 1.客户端javascript window对象是所有客户端javascript特性和API的主要接入点.它表示web浏览器的一个窗口或窗体,并且可以用window表示来引用它.window ...
随机推荐
- Spring源码分析——BeanFactory体系之接口详细分析
Spring的BeanFactory的继承体系堪称经典.这是众所周知的!作为Java程序员,不能错过! 前面的博文分析了Spring的Resource资源类Resouce.今天开始分析Spring的I ...
- ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表
zk做为分布式架构中的重要中间件,通常会在上面以节点的方式存储一些关键信息,默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,ZK通过ACL机制来解决访问权限问题,详见官网文档:ht ...
- js动态创建style节点(js文件中添加css)
ie6 不能 document.createElement('style') 然后append到head标签里.所以就找到这样个好文章 --------------------- 有很多提供动态创建 ...
- 小巧数据库 Apache Derby 使用攻略
1. Derby 介绍 将目光放在小 Derby 的原因是纯绿色.轻巧.内存占用小,分分钟在你机子跑起来,自己做点需要连接数据库的代码实践非常方便. 虽然 Mysql 也可以,多一种选择,不是也挺好么 ...
- MVC之前的那点事儿系列(8):UrlRouting的理解
文章内容 根据对Http Runtime和Http Pipeline的分析,我们知道一个ASP.NET应用程序可以有多个HttpModuel,但是只能有一个HttpHandler,并且通过这个Http ...
- HTML5之API
HTML5就是牛,可以直接播放音视频,还可以作图: 一.HTML5中播放视频和音频: 加载时直接播放音频的方式:new Audio("BY2.mp3").play(); <d ...
- spring-初始化完成后运行指定内容
方案1:继承ApplicationListener public class InstantiationTracingBeanPostProcessor implements ApplicationL ...
- Ubuntu/mint清理系统垃圾
Ubuntu Linux与Windows系统不同,Ubuntu Linux不会产生无用垃圾文件,但是在升级缓存中,Ubuntu Linux不会自动删除这些文件,今天就来说说这些垃圾文件清理方法. 1 ...
- 搭建maven项目
一.新建项目 点击"Maven Project",如果没有的话在"Other"里面 勾选这个选项,这样可以建立一个没有多余文件的简单项目(如果这个时候直接建立w ...
- <<< 如何查看自己是外网还是内网
判断的方法很简单,就是看你的网络中有没有路由器,不管是有线路由还是无线路由,只要你的网络中用了路由,那你就是内网,用路由器的网络有一个特点,那就是只要路由器在开着,那你开了电脑之后就可以直接上网,不需 ...