js中this的绑定
人们对于this的绑定常常有两个误解,一:指向函数本身,二:指向函数作用域。这两种想法都是错的,this并不指向函数本身,也不指向函数作用域。
function foo(){
this.count++;
}
foo.count = 0;
for(var i = 0 ; i<5 ; i++){
foo();
}
alert( foo.count ); //
因为this不指向函数本身,所以foo.count的值依然是0。
function foo(){
var a = 1 ;
alert(this.a);
}
var a = 2;
foo(); //
因为this不指向函数作用域,所以输出的是2。
this实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用。
this的绑定一共有四种绑定:1:默认绑定(即没有明确的调用对象)
2:隐性绑定(即作为对象方法调用,this会被绑定到该对象)
3:显性绑定(使用apply()和call()调用,两个方法的第一个参数为一个对象,this被绑定到该对象)
4:new绑定(使用new来调用函数,会构造一个新对象,并且把this绑定到该对象)
一:默认绑定 (即没有明确的调用对象)
function foo(){
var a = 1 ;
alert(this.a);
}
var a = 2;
foo(); // 2 (非严格模式下)
没有明确调用对象,this会被绑定到window对象,所以this.a就是window.a,即为2。不过这得在非严格模式下,只有在非严格模式下this才会被绑定到window对象,而在严格模式下,this被绑定到undefined。
二:隐性绑定 (即作为对象方法调用,this会被绑定到该对象)
function foo(){
var a = 1;
alert(this.a);
}
var obj = {
a:2,
foo:foo
};
obj.foo(); //
obj对象调用foo()函数,this被绑定到obj对象,所以输出了obj对象的a的值2。
对象属性引用链中只有最后一层会影响调用位置
function foo(){
alert(this.a);
}
var obj2 = {
a:2,
foo:foo
};
var obj1 = {
a:1,
obj2:obj2
};
obj1.obj2.foo(); //
obj1和obj2两个对象连续调用,this会被绑定到最后一个对象,即obj2,所以输出2
隐式丢失:被隐式绑定的函数会丢失绑定对象,有两种情况会丢失,一种为引用,另一种为回调函数。
引用:
function foo(){
alert(this.a);
}
var obj = {
a:1,
foo:foo
};
var bar = obj.foo;
var a = "global 1";
bar(); //global 1
bar是obj.foo的一个引用,实际上它引用的是foo函数本身,所以this被绑定到window对象,输出的是"global 1"
回调函数:
function foo(){
alert(this.a);
}
function doFoo(fn){
fn();
}
var obj = {
a = 1,
foo:foo
}
var a = "global 1";
doFoo(obj.foo); //"global 1"
调用回调函数的函数可能会修改this
三:显性绑定(使用apply()和call()调用,两个方法的第一个参数为一个对象,this被绑定到该对象)
function foo(){
alert(this.a);
}
var obj = {
a:1
};
foo.call(obj); //
call()的参数若为空,默认调用window对象,若为一个原始值(字符串类型,布尔类型或者数字类型),则这个原始值会被转换成它的对象形式(new String(),new Boolean() 或者 new Number()),这被称为“装箱”
硬绑定———显示绑定的一种变形
优点:可以解决丢失绑定问题
缺点:硬绑定后不可能再修改它的this
function foo(){
alert(this.a);
}
var obj = {
a:2
};
var bar = function(){
foo.call(obj);
};
bar(); //
setTimeout(bar,100); //
bar.call(window); //
ES5中提供了内置方法Function.prototype.bind
function foo(something){
alert(this.a, something);
return this.a + something;
}
var obj = {
a:2
};
var bar = foo.bind(obj);
var b = bar(3); // 2 3
alert(b); //
bind()会返回一个硬编码的新函数,它会把参数设置为this的上下文并调用原始函数
四:new绑定(使用new来调用函数,会构造一个新对象,并且把this绑定到该对象)
function foo(a){
this.a = a;
}
var bar = new foo(2);
alert(bar.a); //
this绑定的四条规则的优先级: new绑定 > 显示绑定 > 隐式绑定 > 默认绑定
js中this的绑定的更多相关文章
- js中的前绑定和后绑定详解
这篇文章详细介绍了js中的前绑定和后绑定,有需要的朋友可以参考一下 其主要意思就是看我有没有用过前绑定,即Dom树中的某些元素在还没有创建出来时,就指定该类型的元素一出生就应该拥有的某些事件.在实际开 ...
- js中this的绑定规则及优先级
一. this绑定规则 函数调用位置决定了this的绑定对象,必须找到正确的调用位置判断需要应用下面四条规则中的哪一条. 1.1 默认绑定 看下面代码: function foo() { cons ...
- js中同一个onclick绑定了两个js方法出现的问题
问题: js中如果同一个onclick绑定了两个js方法问题,即 <li onclick="f1(),f2()"></li> 两个方法f1,f2中都分别有一 ...
- js中的事件绑定的三种方式
1 直接在html标签中绑定 <button onclick = "show()"></button> 注意当你引用的js代码是包裹在window.onlo ...
- 关于js中对事件绑定与普通事件的理解
普通事件指的是可以用来注册的事件: 事件绑定是指把事件注册到具体的元素之上. 通俗点说: 普通事件:给html元素添加一个特定的属性(如:onclick): 事件绑定:js代码中通过标记(id ta ...
- JS 中的事件绑定、事件监听、事件委托
事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有 ...
- js中传统事件绑定模拟现代事件处理
大家都知道,IE中的现代事件绑定(attachEvent)与W3C标准的(addEventListener)相比存在很多问题, 例如:内存泄漏,重复添加事件并触发的时候是倒叙执行等. 下面是用传统事件 ...
- JS 中的事件绑定、事件监听、事件委托是什么?
在JavaScript的学习中,我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代理)等.这些名词是什么意思呢,有什么作用呢? 事件绑定 要想让 JavaScri ...
- JS中的事件绑定,事件捕获,事件冒泡以及事件委托,兼容IE
转载请注明出处:http://www.cnblogs.com/zhangmingze/p/4864367.html ● 事件分为三个阶段: 事件捕获 --> 事件目标 --> ...
随机推荐
- PDO 数据访问抽象层
1.操作其它数据库 (1)造对象 $dsn = "mysql:dbname=test3;host=localhost"; //数据源:两个参数:数据库驱动,链接数据库 $pdo = ...
- java中集合类中Collection接口中的Map接口的常用方法熟悉
1:Map接口提供了将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.Map接口中同样提供了集合的常用方法. 2:由于Map集合中的元素是通过key,value,进行存储的,要 ...
- 当GitHub把我当成DDos攻击者拉进了黑名单中。。。
Github黑名单自救+快速稳定FQ 异常处理汇总-开发工具 http://www.cnblogs.com/dunitian/p/4522988.html 原因:项目冲突,没有先更新后提交,他自行更 ...
- C指针(一)
原文链接:http://www.orlion.ga/916/ 一.指针的基本操作 例: int i; int *pi = &i; char c; char *pc = &c; &quo ...
- 虚拟文件系统(VFS)
原文链接:http://www.orlion.ga/1008/ linux在不同的文件系统之上做了一个抽象层,使得文件.目录.读写访问等概念都成为抽象层概念,这个抽象层被称为虚拟文件系统(VFS). ...
- DOM扩展-Selectors API(选择符 API)、元素遍历
DOM扩展 对DOM的两个主要扩展是SelectorsAPI(选择符API)和HTML5 SelectorsAPI(选择符API)是由W3C发起制定的一个标准,致力于浏览器原生支持CSS查询,Sele ...
- 在ASP.NET MVC的Action中直接接受客户端发送过来的HTML内容片段
出于安全的考虑,默认情况下,如果从客户端发送过来的数据中直接包括了HTML内容,ASP.NET会自动启动保护措施,你会收到下面的错误提示 这当然是一个不错的设计,只不过在某些特殊的事情,如果我们确实需 ...
- 【记录】JS 生成 URL 二维码
示例代码: <html> <head> <title>example</title> </head> <body> <sc ...
- ZOJ Problem Set - 1402 Magnificent Meatballs
比较简单的题目,题目大意就是将n个数字围成一个圈,找到一个划分,是的划分左边的数字之和等于右边的数字之和: e.g 10 1 2 2 5,那么可以找到一个划分10 | 1 2 2 5使得两边数字之和都 ...
- ZOJ Problem Set - 1201 Inversion
题目:这道题目的意思让人猛地一读有点反应不过来,简单解释下: 给定序列A:a1,a2,a3....,an,如果i<j且ai>aj则(ai,aj)称为序列A的一个倒置. 之后引出了序列的倒置 ...