this软拷贝详解
<script>
if( !Function.prototype.softBind ){ Function.prototype.softBind = function( obj ){ var fn = this;//2、把函数foo的引用赋给fn
//14、把函数foo的引用赋给fn var curried = [].slice.call( arguments, 1 );//3、截取softBind函数参数的第二位并返回一个函数
//15、截取softBind函数参数的第二位并返回一个函数 var bound = function(){//4、声明一个bound函数
//16、声明一个bound函数 return fn.apply(//11、执行fn.apply( obj, [] )
//23、执行fn.apply( obj2, [] )
(!this || this === (window || global)) ?
obj : this,
//核心程序 !this || this === (window || global)) ? obj : this
//判断bound函数内this的指向
//9、this为window,|| true 对象为obj
//21、this为obj2, || false 对象为this => obj2
curried.concat.apply( curried, arguments )//10、所有的参数合并为一个数组
//22、所有的参数合并为一个数组
)
}
//
bound.prototype = Object.create( fn.prototype );//5、函数bound的原型赋值为fn的原型
//17、函数bound的原型赋值为fn的原型
return bound;//6、返回bound函数
//18、返回bound函数
}
} function foo(){//12、输出name: obj1
//23、输出name: obj2
console.log("name: "+this.name);
} var obj1={name:"obj1"},
obj2={name:"obj2"},
obj3={name:"obj3"}; var fooOBJ=foo.softBind(obj1);//1、执行函数,因为每一个函数都有一个softBind方法
//7、fooOBJ = bound; fooOBJ();//8、执行fooOBJ() => bound() obj2.foo=foo.softBind(obj1);//13、执行foo.softBind(obj1)
//19、obj2.foo方法引用为bound函数 obj2.foo();//20、执行obj2.foo() fooOBJ.call(obj3);//【只要改变函数内this的指向就可以改变输出的值】 setTimeout(obj2.foo,1000);//"name: obj1"
/**回调函数相当于一个隐式的传参,如果没有软绑定的话,这里将会应用默认绑定将this绑定到全局环
境上,但有软绑定,这里this还是指向obj1*/
</script>
this软拷贝详解的更多相关文章
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- Linux使用scp命令进行文件远程拷贝详解
前言 scp是 secure copy的缩写, scp是Linux系统下基于ssh登陆进行安全的远程文件拷贝命令.Linux的scp命令可以在Linux服务器之间复制文件和目录. 使用语法: scp ...
- String 类的实现(2)深度拷贝详解
我们已经知道了浅拷贝存在的问题,即多次析构同一空间.这个问题是类的成员函数引起的,就是前面浅拷贝里相当于编译器自动合成的函数,确切的说,浅拷贝里的问题是由隐士拷贝构造函数和隐士赋值运算符引起的. 拷贝 ...
- js数组和对象相等判断、拷贝详解(结合几个现象讲解引用数据类型的趣事)
序言 最近遇到几个js引用数据类型造成的bug,今天结合bug详细分析一下,避免以后再犯,也希望能帮大家提个醒,强化js基本功. 目录 1.浅拷贝.深拷贝,解决变量赋值相互影响问题 2.判断2个数组. ...
- Netty基础系列(4) --堆外内存与零拷贝详解
前言 到目前为止,我们知道Nio当中有三个最最核心的组件,分别是:Selelctor,Channel,Buffer.在Netty基础系列(3) --彻底理解NIO 这一篇文章中只是进行了大致的介绍. ...
- 【转】 c++拷贝构造函数(深拷贝,浅拷贝)详解
c++拷贝构造函数(深拷贝,浅拷贝)详解 2013-11-05 20:30:29 分类: C/C++ 原文地址:http://blog.chinaunix.net/uid-28977986-id-3 ...
- linux dd命令参数及用法详解---用指定大小的块拷贝一个文件(也可整盘备份)
linux dd命令参数及用法详解---用指定大小的块拷贝一个文件 日期:2010-06-14 点击:3830 来源: 未知 分享至: linux dd命令使用详解 dd 的主要 ...
- 【C++】拷贝构造函数(深拷贝,浅拷贝)详解
一.什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 下面看一个类对 ...
- 软RAID管理命令mdadm详解
软RAID管理命令mdadm详解 mdadm是linux下用于创建和管理软件RAID的命令,是一个模式化命令.但由于现在服务器一般都带有RAID阵列卡,并且RAID阵列卡也很廉价,且由于软件RAID的 ...
随机推荐
- Sqlite教程(4) Activity
之前我们已经有了DbHelper.Data Access Object.Configuration. 那麽现在就是由Activity去创建它们,然後就可以存取Sqlite. 架构图表示了它们的关系. ...
- 迅为iTop开发板使用buildroot构建opencv文件系统
这次我们来介绍使用buildroot构建opencv开发环境,buildroot 是 Linux平台上一个构建嵌入式Linux系统的框架.整个buildroot是由 Makefile脚本和Kconfi ...
- word打印,和打印预览
public void Print(object fileName) { try { foreach (Syst ...
- Linux 设置开机启动项的几种方法
方法一:编辑rc.loacl脚本 Ubuntu开机之后会执行/etc/rc.local文件中的脚本. 所以我们可以直接在/etc/rc.local中添加启动脚本. $ vim /etc/rc.loca ...
- react项目中引入了redux后js控制路由跳转方案
如果你的项目中并没有用到redux,那本文你可以忽略 问题引入 纯粹的单页面react应用中,通过this.props.history.push('/list')就可以进行路由跳转,但是加上了redu ...
- WebFilter 在springBoot工程中不起作用
[1]@ServletComponentScan 必须有一个注解将带有@WebFilter的类包含进去. [2]自定义 FiltersConfig extends WebMvcConfigurerAd ...
- 署名|单位地址|Abstract
科研论文写作---如何署名单位地址 署名的作者要研究结果负责,其署名作为对所作贡献的认可. 参与设计实验想法,参与实验过程,参与起草论文或重大修改论文,或对论文定稿的学者拥有署名权.而资金资助& ...
- leetcode第22题:括号生成
力扣上的题目可以大致分为以下种类: 对某种复杂规则的彻底解析,很有可能要构造状态机,充分考虑边界情况. 对某种数据结构及算法的应用. 对数学概念.遍历.动态规划等的综合应用. 通过分析,本题应该属于1 ...
- 关于php自学
自己本人现在正在自学php有一段时间了,不知道现在的学习状态咋样,在我看来应该属于不算很糟糕,但有点糟糕的状态. 如果算学习自学php的话,现在断断续续应该是有5个月了,按理说是差不多可以做出独立项目 ...
- JVM内存基本理解
声明:本文内容仅作为本人方便记忆和查看所用. JVM有五块内存空间: 1.method area:用于存储已被加载的类信息.常量.静态变量.即时编译后的代码等数据. 注:在JDK8中,Method A ...