## 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]);
~~~