Javascript Function.prototype.bind详细分析
Function.prototype.bind分析
bind()方法会创建一个新的函数,成为绑定函数。当调用这个绑定函数时,绑定函数会以创建它时传入的第一个参数作为this,传入bind()方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调取原函数。
实际使用中我们经常会碰到这样的问题
var name = "pig"; function Person(name){ this.name = name; this.getName = function(){ setTimeout(function(){ console.log("Hello,my name is "+this.name); },100); } } var weiqi = new Person("卫旗"); weiqi.getName(); //Hello,my name is pig
这个时候输出this.name是pig,原因是this的指向是在运行函数时确定的,而不是在定义函数时确定的,再因为setTimeout是在全局环境下只想,所以this就指向了window。
以前解决这个问题的办法通常是缓存this,例如
var name = "pig"; function Person(name){ this.name = name; this.getName = function(){ //在这里缓存一个this var self = this; setTimeout(function(){ //在这里是有缓存this的self console.log("Hello,my name is "+self.name); },100); } } var weiqi = new Person("卫旗"); weiqi.getName(); //Hello,my name is 卫旗
这样就解决了这个问题,非常方便,因为它使得setTimeout函数中可以访问Person的上下文。
现在有一个更好的解决办法,可以使用bind()函数,上面的例子可以被更新为
var name = "pig"; function Person(name){ this.name = name; this.getName = function(){ setTimeout(function(){ console.log("Hello,my name is "+this.name); }.bind(this),100); //注意上面这一行,添加了bind(this) } } var weiqi = new Person("卫旗"); weiqi.getName(); //Hello,my name is 卫旗
bind()最简单的用法是创建一个函数,使得这个函数无论怎么样调用都拥有同样的this值。JavaScript新手经常犯的一个错误就是将一个方法从一个对象中拿出来,然后再调用,希望方法中的this是原来的对象(比如在回调函数中传入这个方法)。如果不做特殊处理的话,一般会丢失原来的对象。从原来的函数和原来的对象创建一个绑定函数,则可以很漂亮的解决这个问题
//定义全局变量x var x = "window"; //在module内部定义x var module = { x:"module", getX:function(){ console.log(this.x); } } module.getX(); //返回module,因为在module内部调用getX() var getX = module.getX; getX(); //返回window,因为这个getX()是在全局作用域中调用的 //绑定getX()并将this值设为module var boundGetX = getX.bind(module); boundGetX(); //返回module,绑定以后this值始终为module
浏览器支持情况
Browser | Version support |
---|---|
Chrome | 7 |
FireFox(Gecko) | 4.0(2) |
Inter Explorer | 9 |
Opera | 11.60 |
Safari | 5.14 |
很不幸,Function.prototype.bind在IE8及以下版本中不被支持,所以如果没有一个备选方案的话,可能会在运行时出现问题。bind函数在ECMA-262第五版才被加入。它可能不无法在所有浏览器上运行。你可以在脚本部分加入如下代码,让不支持的浏览器也能使用bind()功能。
if (!Function.prototype.bind) { Function.prototype.bind = function (oThis) { if (typeof this !== "function") { // closest thing possible to the ECMAScript 5 internal IsCallable function throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); } var aArgs = Array.prototype.slice.call(arguments, 1), fToBind = this, fNOP = function () {}, fBound = function () { return fToBind.apply(this instanceof fNOP && oThis ? this : oThis || window, aArgs.concat(Array.prototype.slice.call(arguments))); }; fNOP.prototype = this.prototype; fBound.prototype = new fNOP(); return fBound; }; }
语法
fun.bind(thisArg[, arg1[, arg2[, …]]])
参数
thisArg,当绑定函数被调用时,该参数会作为原函数运行时的this指向,当使用new操作符调用绑定函数时,该参数无效。
arg1, arg2, …,当绑定函数被调用时,这些参数加上绑定函数本身的参数会按照顺序作为原函数运行时的参数。
描述
bind()函数会创建一个新的函数(一个绑定的函数)有同样的函数体(在ECMAScript 5 规范内置Call属性),当该函数(绑定函数的原函数)被调用时this值绑定到bind()的第一个参数,该参数不能被重写。绑定函数被调用时,bind()也接受预设的参数提供给原函数。一个绑定函数也能使用new操作符创建对象这种行为就像把原函数当成构造器。提供的this值被忽略,同事调用的参数被提供给模拟函数。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程