多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[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)