一、根据函数调用方式的不同,就会指向不同的对象:
以函数的形式调用时,this就永远指向window
var name="zhang"function show(){console.log(this.name)}// 函数正常调用的时候 this指向windowfunction go(){var name="lisi"show()}go() //window.go()
以方法的形式调用时,this就是调用方法的那个对象
function fun(){console.log(this.name)}var obj={name:"xuan",sayName:fun}obj.sayName() // xuan
二、改变函数中this指向
2-1、call
var name="王五"var obj = { name:"瑄瑄" }function go(){console.log(this.name);}go() // 王五go.call(obj) // 瑄瑄
2-2、apply
var names = "wangwu"var obj = {name: "xuanxuan"}function nam() {console.log(this.name)}// apply 可以改变函数内部关键字的指向 funName.apply(obj)nam.apply(obj)
2-3、bind
bind 绑定的函数不会马上执行,只是改变了函数上下文的执行环境
var name = "window"var obj = {name: "xuan"}var show=function go(a, b) {console.log(this.name)console.log(a + b)}.bind(obj) //bind 绑定的函数不会马上执行,只是改变了函数上下文的执行环境// call apply 调用的时候马上执行show(5,6)
使用场景
<button id="btn">按钮</button><script>var id="1001";var btn = document.getElementById("btn")btn.onclick = function(){setTimeout(function(){ // window.setTimeoutconsole.log(this.id); // 1001},1000)}</script>## 解决# 1.使用bind解决btn.onclick = function(){setTimeout(function(){console.log(this.id);}.bind(btn),1000)}/* btn.onclick = function(){var self = thissetTimeout(function(){console.log(this.id);}.bind(self),1000)}btn.onclick = function(){setTimeout(function(){console.log(this.id);}.bind(this),1000)}*/# 2.使用箭头函数解决btn.onclick = function(){setTimeout(()=>{console.log(this.id);},1000)}
三、call和apply的区别
- c**all:依次传递**
 apply:需要传递数组
var name="window"var obj={name:"xuan"}function go(a,b){console.log(this.name)console.log(a+b)}// go(5,6)// 传递多个参数// call:依次传递// apply:需要传递数组go.call(obj,5,6) // xuan 11go.apply(obj,[5,6])
