[toc]
## 什么是this
>當前函數執行的主體(誰執行的函數this就是誰)
>
> 函數外面的this是window,我們一般都研究函數內的this指向問題
```
小明.eat();
//小明是主體
//小明在哪里吃飯 在哪里就是context
```
## this是誰和他在哪定義以及在哪執行的沒有任何關系
this只看函數執行的主體。
```
function fn(){
console.log(this);
}
fn(); //window
//case2:改變定義環境
function fn(){
function b(){
console.log(this);
}
b();
}
fn(); //window
//case1:改變執行環境
function fn(){
console.log(this);
}
~function(){
fn();
}()
```
對象下的方法不一定總指向對象
```
var obj = {
name:'obj'
,fn:function(){
console.log(this);
}
}
obj.fn(); //this->obj
var f = obj.fn; //把obj.fn的地址給了小f
f(); //this->window
```
## this情況指向小結
> ### 在JS非嚴格模式下(默認模式)
>1、 自執行函數中的this一般都是window
```
var obj = {
fn:(function(){
//this->window
return function(){};
})()
}
```
>2、 給元素的某個事件綁定方法,當事件觸發執行對應方法時候,方法中的this一般都是指向元素本身
```
oBox.onclick = function(){
//this->oBox
}
```
>3、 還有一種方式可以快速區分this,當方法執行的時候,看看方法名前面是否有**點**,有的話,`.`前面是誰,`this`就是誰,沒有一般都是window。
>4、 構造函數中的this,是當前類的一個實例
>5、 call/apply/bind,權重高于上面四條
---
> ### 在JS嚴格模式下(讓JS更加嚴謹)
開啟嚴格模式:在當前作用域第一行加上`use strict`開啟嚴格模式,那么當前作用域下再執行JS代碼就是按照嚴格模式處理的
```
"use strict";
//=>當前JS代碼都開啟了嚴格模式(包括函數中的代碼)
```
```
~function(){
"use strict";
//=>只是把當前私有作用域開啟了嚴格模式(對外面全局沒有影響)
}();
```
在嚴格模式下,如果執行主體不明確指向的是undefined(非嚴格模式下this指向的是window);
```
function fn(){
console.log(this);
}
fn(); //->window
window.fn(); //->window
//--- --- ---
function fn(){
console.log(this);
}
fn(); //->undefined
window.fn(); //->window
```
## 其它栗子
事件綁定的函數不一定指向元素
```
function fn(){
console.log(this);
}
document.body.onclick=function(){
//this->body
fn(); //this->window
}
```
this與閉包的綜合栗子
```
var num = 1 //2 這貨也是window.num
,obj = {
num:2
,fn:(function(num){ //1
this.num *= 2; //window.num = 2
num += 2; //3
return function(){
this.num += 3; //window.num = 6 //obj.num = 6
num++; //4 //5
console.log(num); //4 //5
}
})(num) //1
};
var fn = obj.fn;
fn(); //4
obj.fn(); //6
console.log(num,obj.num); //6 6
```

- 空白目錄
- window
- location
- history
- DOM
- 什么是DOM
- JS盒子模型
- 13個核心屬性
- DOM優化
- 回流與重繪
- 未整理
- 文檔碎片
- DOM映射機制
- DOM庫封裝
- 事件
- 功能組件
- table
- 圖片延遲加載
- 跑馬燈
- 回到頂部
- 選項卡
- 鼠標跟隨
- 放大鏡
- 搜索
- 多級菜單
- 拖拽
- 瀑布流
- 數據類型的核心操作原理
- 變量提升
- 閉包(scope)
- this
- 練習題
- 各種數據類型下的常用方法
- JSON
- 數組
- object
- oop
- 單例模式
- 高級單例模式
- JS中常用的內置類
- 基于面向對象創建數據值
- 原型和原型鏈
- 可枚舉和不可枚舉
- Object.create
- 繼承的六種方式
- ES6下一代js標準
- babel
- 箭頭函數
- 對象
- es6勉強筆記
- 流程控制
- switch
- Ajax
- eval和()括號表達式
- 異常信息捕獲
- 邏輯與和或以及前后自增
- JS中的異步編程思想
- 上云
- 優化技巧
- 跨域與JSONP
- 其它跨域相關問題
- console
- HTML、XHTML、XML
- jQuery
- zepto
- 方法重寫和方法重載
- 移動端
- 響應式布局開發基礎
- 項目一:創意簡歷