【JS】函数中 this 的几种情况

110 阅读2分钟

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:函数里面要传递的参数