[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
```
![](https://box.kancloud.cn/c48532ace405db74c429bac18bc85306_1184x731.png)
- 空白目录
- 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
- 方法重写和方法重载
- 移动端
- 响应式布局开发基础
- 项目一:创意简历