🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## Js中,window为顶级作用域,全局变量为window的属性,函数为window的方法 #### 1. 普通函数中使用this,this指向window ~~~ var name = 'zhangSan' var a = function(){ console.log('this',this); console.log('name',this.name); // zhangSan } a(); ~~~ #### 2. 在事件中,this指向正在执行的事情的当前对象 ~~~ <button id='btn' value="点击一下">点击</button> <script> var btn = document.getElementById('btn'); var value = 'haha'; btn.onClick = function() { console.log('this',this); console.log('value',this.value); // 点击一下 } </script> ~~~ #### 3. 在方法中,谁调用方法,this指向谁 ~~~ var name = 'tong'; var jiang = { name: 'jiang', sayName: function(){ console.log('this',this) console.log('name',this.name); } } jiang.sayName(); ~~~ ## 改变this指向问题的三种方法 #### 1.call (注:js) * 使用方法: a.call(object,params); * 原理: 改变函数内部this关键字的指向 #### 2.apply (注:js) * 使用方法: a.apply(object,[params]); * 原理: 改变函数内部this关键字的指向 #### 3.bind (注:ECMAScript) * 使用方法: a.bind(object,params)(); || a.bind(object)(params); || a.bind(object,arg1),(arg2) * 原理: 改变函数执行顺序,返回执行上下文被改变的函数 测试案例: ~~~ var tong = { name: 'tong' } var cheng = { name: 'cheng' } var pi = { name: 'pi' } var name = 'hahaaaa' var jiang = { name: 'jiang', sayName: function(a,b){ console.log('this',this) console.log('name',this.name); console.log('a+b',a+b); } } jiang.sayName.bind(pi,4,5)(); jiang.sayName.bind(pi)(4,6); jiang.sayName.bind(pi,4)(7); jiang.sayName.call(cheng,1,2); jiang.sayName.apply(tong,[2,4]); ~~~