函数的this指向
-
概述
if(被调用的函数属于某一对象obj) { this = obj; }else{ this = 某个环境(window) } -
独立函数调用(独立指没有显性跟任何对象绑定)
这种函数的this默认指向window
-
在全局中创建函数,并调用
function test() { console.log(this); } console.log(window.test)//test test();//window.test();在全局作用域创建一个函数,函数调用是单独调用(没有使用xx对象.b()调用)。所以this指向window
-
在某个函数中创建函数,并且调用
let obj = { name: "xiaomi", myMethods() { function test() { console.log(obj.test);//undefined console.log(window.test);//undefined console.log("-------"); console.log(this);//window } test(); } } obj.myMethods();obj调用myMethods方法,在方法里面创建一个函数,该函数没有绑定到任何对象上(比如obj.test = function(){}),也没有由obj执行(比如obj.test());但是该函数执行时的this默认指向window
-
隐式丢失
let obj = { name: "小米", sayThis() { console.log(this); } } var b = obj.sayThis; console.log(window.b);//sayThis() {console.log(this);} b();//window设obj.sayThis指向的函数为该函数,在执行var b = obj.sayThis, b便指向该函数。如果声明使用var, b便绑定在window对象上。b在调用的时候是独立调用(没有使用xx对象.b()调用),所以指向window
-
回调函数
let obj1 = { b() { console.log(this);//window } } function a(callback) { callback(); } a(obj1.b)设obj.b为该函数,a函数调用的时候,将该函数赋值给a函数内执行作用域内callback变量, callback没有绑定任何的对象,所以是独立调用,默认指向window
-
-
对象调用函数
-
普通对象调用
let obj = { name: "小米", sayThis() { console.log(this); } } obj.sayThis();//objsayThis是绑定在obj对象的方法,并且由obj调用,所以this指向obj
-
鼠标事件调用
<body> <button id="btn">按钮</button> <script> let btn = document.getElementById("btn"); btn.onclick = function() { console.log(this); } //<button id="btn">按钮</button> </script> </body>函数被赋值给btn的onclick属性,btn调用onclick,this指向btn
-
-
new 新对象
function Person() { this.name = "小米"; console.log(this); } new Person();//Person -
箭头函数
官方概念: 箭头函数内部的
this总是指向词法作用域(定义时所在的对象)function中的this指向的是使用时所在的对象,而箭头函数中的this指向定义时所在的对象
个人理解:在箭头函数定义的旁边打印的this就是箭头函数内部的this指向
let fn = ()=> { console.log(this) } //在箭头函数定义的旁边打印的this就是箭头函数内部的this指向 console.log(this);//window fn();//windowvar obj = { age: 20, say: () => { console.log(this); } } //在箭头函数定义的旁边打印的this就是箭头函数内部的this指向 console.log(this); obj.say();var obj = { age: 20, say() { //在箭头函数定义的旁边打印的this就是箭头函数内部的this指向 console.log(this);//obj let a = ()=> { console.log(this);//obj } a(); } } obj.say();