1.函数作为普通函数调用,this指向window
var name="张三";function show(){console.log(this.name);}function go(){var name="李四";show();}go();//window.go()
2.改变this关键字指向方法:call,apply,bind
(1)ccll方法
var name="张三";var obj={name:"李四"}function go(){console.log(this.name);}go();// 输出张三go.call(obj);//李四
(2)apply方法
var name="张三";var obj={name:"李四"}function go(){console.log(this.name);}go();// 输出张三go.apply(obj);//李四
(3)bind方法
bind绑定的函数不会马上执行,只是改变了函数上下文的执行环境<br /> call ,applay调用的时候会马上执行
var name="window"var zhang={name:"李四"}var show=function(a,b){console.log(this.name);console.log(a+b);}.bind(zhang);show(2,3);
(4)Call和apply之间的区别
如果要传递参数,apply跟数组
var name="window"var zhang={name:"李四"}function show(a,b){console.log(this.name);console.log(a+b);}show(1,2) // 输出window 3show.call(zhang,2,3) //输出 李四 5show.apply(zhang,[1,2]) //输出 李四 3
3.使用场景 解决定时器在事件中的指向问题
<button id="btn">按钮</button><script>var id="1001"var btn=document.getElementById("btn");btn.onclick=function(){// console.log(this.id);window.setTimeout(function(){console.log(this.id);//输出1001},1000)}</script>//输出1001
解决方法:
(1)bind
<button id="btn">按钮</button><script>var id="1001"var btn=document.getElementById("btn");btn.onclick=function(){// console.log(this.id);window.setTimeout(function(){console.log(this.id);}.bind(this),1000)}</script>//输出btn
(2)self方法
<button id="btn">按钮</button><script>var id = "1001"var btn = document.getElementById("btn");btn.onclick = function(){var self = this; //增进语义化setTimeout(function(){console.log(this.id)}.bind(self), 1000) //bind方法改变上下文执行环境}</script>
(3)使用箭头函数
<button id="btn">按钮</button><script>var id="1001"var btn=document.getElementById("btn");btn.onclick=function(){setTimeout(()=>{console.log(this.id);},1000)}</script>//输出btn
