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