this
this就是执行的主体(和上下文不是一个东西)
1.有没有点
函数执行的时候,看前面有没有点,如果有点,前面是谁,this就是谁;没点,this就是window(非严格模式下),严格模式下就是undefined
function fn(){
console.log(this);
}
fn();
//=> Window
"use strict"
function fn(){
console.log(this);
}
fn();
//=> undefined
var name = "Lily";
function fn(){
console.log(this.name);
}
var obj ={
"name":"LiHua",
fn:fn
}
obj.fn();
//=> "LiHua"
fn();
//=>"Lily"
解析: 此例中,因为是obj.fn(),函数fn执行的时候this就是obj;而没有点执行时, fn() ,输出的就是Window 对象中的name属性。
2.自执行函数中的this
自执行函数中的this是Window(非严格模式下),严格模式下是undefined
(function(){
console.log(this);
})()
//=> Window
3.给页面中的元素绑定事件
给页面中的元素绑定事件,当事件触发的时候,函数里面的this就是当前绑定的元素(特殊:dom 2级事件 ie6-8 下除外)
var box = document.getElementById("box");
box.onclick = function(){
console.log(this);
}
//=> 这里的this就是绑定的元素对象 box
4.回调函数中的this
回调函数中的this是Window(非严格模式),严格模式下是undefined,当然还有一些特殊情况
回调函数:把一个函数当成实参传递给另一个函数
5.构造函数中的this
构造函数中的this是当前实例
6.箭头函数中的this
箭头函数和块级作用域中没有自己的this,里面的this用的都是上下文中的this
箭头函数中的this是在它声明时捕获它所处作用域中的this。
特别说明: this一旦被捕获,以后将不再变化。不会被call、apply、bind改变this指向
7.call/apply/bind
基于call/apply/bind 可以强制改变this
var name = "Lily";
function fn(){
console.log(this.name);
}
var obj ={
"name":"LiHua",
fn:fn
}
fn.call(obj);
//=> "LiHua"
call的用法
call(x,y)
参数 x:将函数里面的this改为 x ,然后立即执行
参数 y:函数里面要传递的参数