MDN关于this的描述app
在全局运行上下文中(在任何函数体外部),this指代全局对象,不管是否在严格模式下函数
console.log(this.document === document);//true console.log(this === window); //true this.a = 22; console.log(window.a); //22
在函数内部,this的值取决于函数是如何调用的ui
function f1() { return this; } f1() === window; //true function f2() { "use strict"; return this; } f2() === undefined; // true 在严格模式下,this是进入运行环境时设置的
var o = { prop: 22, f: function() { return this.prop; } }; console.log(o.f());//22
var o = { f: function(){ return this.a + this.b; } }; var p = Object.create(o); p.a = 1; p.b = 4; console.log(p.f()); //5
经过call()和applly(),能够将this绑定在一个指定的对象上this
function add(c,d){ return this.a + this.b + c + d; } var o = {a:1, b:3}; add.call(o,5,7); add.apply(o,[5,7]);
调用f.bind(someObject)会建立一个与f具备相同函数体和做用域的函数,可是在这个新函数中,this将永久地被绑定到了bind的第一个参数,不管这个函数是如何被调用的。code
function f(){ return this.a; } var g = f.bind({a:'azerty'}); console.log(g());//azerty var o = {a:37, f:f, g:g}; console.log(o.f(), o.g());//37 azerty
this指向触发事件的元素对象
// 被调用时,将关联的元素变成蓝色 function bluify(e){ console.log(this === e.currentTarget); // 老是 true // 当 currentTarget 和 target 是同一个对象是为 true console.log(this === e.target); this.style.backgroundColor = '#A5D9F3'; } // 获取文档中的全部元素的列表 var elements = document.getElementsByTagName('*'); // 将bluify做为元素的点击监听函数,当元素被点击时,就会变成蓝色 for(var i=0 ; i<elements.length ; i++){ elements[i].addEventListener('click', bluify, false); }
当代码被内联处理函数调用时,它的this指向监听器所在的DOM元素:事件
<button onclick="alert(this.tagName.toLowerCase());"> Show this </button>