使用场景:把一个含有this的函数作为值传入另一个函数中运行,此时造成this指向错误的对象。主要出现在事件处理程序以及setTimeout(),setInterval() 使用中。
如何绑定?
ECMAScript5 定义 了bind()原生方法,解决此问题。
bind() 函数 意在将函数的执行环境原封不动的同被传函数传入到另一个函数中。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="../EventHander.js"></script>
</head>
<body>
<button id="btn">点击</button>
<script>
var handler = {
message:'hello',
handleClick:function (ev) {
alert(this.message);
}
}
var btn = document.getElementById('btn');
EventUtil.addHandler(btn,'click',handler.handleClick.bind(handler));
</script>
</body>
</html>
EventUtil.js
var EventUtil = {
getEle:function (id) {
return document.getElementById(id);
},
addHandler:function (ele,type,handler) {
if(ele.addEventListener) {
ele.addEventListener(type,handler,false);
}else if(ele.attachEvent) {
ele.attachEvent(type,handler);
}else {
ele["on"+type] = handler;
}
},
removeHandler:function (ele,type,handler) {
if(ele.removeHandler) {
ele.removeHandler(type,handler,false);
}else if(ele.detachEvent) {
ele.detachEvent(type,handler);
}else {
ele["on"+type] = null;
}
},
getEvent:function (ev) {
return ev?event:window.event;
},
getTarget:function (ev) {
return ev.target || ev.srcElement;
},
preventDefault:function (ev) {
if(ev.preventDefault) {
ev.preventDefault();
}else {
ev.returnValue = false;
}
},
stopPropagation:function (ev) {
if(ev.stopPropagation) {
ev.stopPropagation();
}else {
ev.cancelBubble = true;
}
},
// 获取按键字符编码 键盘事件可用
getCharCode:function (ev) {
if(typeof ev.charCode == "number") {
return ev.charCode;
}else {
return ev.keyCode;
}
}
}
bind()方法不支持IE6-8 ,解决方法如下:
function newBind(fn,context) {
return function() {
return fn.apply(context,fn);
}
}
此外,apply() call() 是每个函数都包含的非继承而来的函数。
参数:[this作用域,params] 参数2可选
作用:
1. 在特定的作用域中调用函数;
2. 扩充函数赖以运行的作用域。(可以理解为this可指向到其他对象上)
如:
window.color='red';
var o = {color:'blue'};
function sayColor() {
alert(this.color);
}
sayColor.call(this); //red 全局作用域下this=>window
sayColor.call(window);//red
sayColor.call(o);//blue 此时this 指向o对象
apply 第二参数 可以是 arguments 或者 参数数组;
call 第二参数 罗列参数