关于JS中this的几种方式

朴灿烈づ我的快乐病毒、 2022-06-06 09:13 316阅读 0赞
  1. 首先关于this的指向问题,关于this我们得分为非严格模式和非严格模式。

在JS非严格模式下

  1. 给元素的某一个事件绑定方法,当事件触发,方法执行的时候,绑定的这个方法中的this一般是当前操作的这个DOM元素。

    oBox.onclick=function(){

    1. //=>当绑定的方法执行,方法中的this:oBox
    2. //=>如何让绑定的方法执行:
    3. //1、手动点击oBox,经由浏览器触发点击事件
    4. //2、oBox.onclick();
    5. //...

    }
    //=>在IE6~8下,如果我们使用的是DOM2事件绑定,方法执行的时候,里面的this不是当前元素而是window。
    oBox.attachEvent(‘onclick’,function(){

    1. //=>this:window

    });

  2. 自执行函数执行,方法中的this一般都是window

    var obj={

    1. fn:(function(){
    2. //=>this:window
    3. return function(){ }
    4. })()

    };
    ~function(){

    1. //=>this:window

    }();

3.方法执行的时候,看方法名之前是否有点,有的话,点前面是谁this就是谁,没有的话,this是window。

  1. function fn(){
  2. console.log(this);
  3. }
  4. var obj={ fn:fn};
  5. fn();//=>this:window
  6. obj.fn();//=>this:obj
  7. //============
  8. //=>数组通过原型查找机制,把Array.prototype上的slice方法找到,并且让方法执行,执行过程中实现数组的按索引查找操作
  9. [].slice(); //=>this:[]
  10. [].__proto__.slice();//=>this:[].__proto__
  11. Array.prototype.slice();//=>this:Array.prototype

4.在构造函数执行的时候,函数体中的this都是当前类的实例

  1. function Fn(){
  2. //=>this:当前Fn的实例(当前案例中指的是f);而this.xxx=xxx都是给当前实例设置的私有属性;
  3. this.xxx=xxx;
  4. }
  5. var f=new Fn();

5.使用Function.prototype上提供的call、apply、bind实现this改变

  1. var obj={ name:'珠峰培训'};
  2. function fn(num1,num2){
  3. this.total=num1+num2;
  4. }
  5. //=>call基础语法的应用
  6. //fn(10,20);//=>this:window
  7. //obj.fn(10,20);//=>obj中并没有fn这个属性,属性值是undefined,它不能作为函数执行,所以会报错:TypeError(undefined is not a function...)
  8. fn.call(obj,10,20);//=>首先让fn中的this指向传递的第一个参数值obj,然后执行fn这个函数:此时fn中的this->obj num1->10 num2->20
  9. fn.call(10,20);//=>fn中的this:10 num1=20 num2=undefined
  10. fn.call();//=>fn中的this:window num1=num2=undefined <=> fn()
  11. fn.call(null);
  12. fn.call(undefined);//=>第一个参数不管写的是null还是undefined都代表没有指向的this,所以函数中的this依然是window
  13. var obj={ name:'珠峰培训'};
  14. function fn(num1,num2){
  15. this.total=num1+num2;
  16. }
  17. //=>apply的语法和作用 跟call基本上完全类似,只有一个区别
  18. fn.call(obj,10,20);
  19. //<=>
  20. fn.apply(obj,[10,20]); //=>apply方法调用的时候,第一个参数是this指向,第二个参数是一个数组,数组中包含了所有需要给函数传递的实参(语法要求是写成一个数组,但是和call一样也是一项项的给形参赋值的)
  21. var obj={ name:'珠峰培训'};
  22. function fn(num1,num2){
  23. this.total=num1+num2;
  24. }
  25. fn.call(obj,10,20);//=>改变fn中的this,而且把fn立即执行了
  26. fn.bind(obj,10,20);//=>虽然改变了fn中的this,但是并没有把fn执行,它属于预先处理this和实参,不会立即执行,只有达到某个特点条件,才会被触发执行的 (IE6~8不兼容)

6.在ES6中,新增加了箭头函数,箭头函数中没有执行主体,箭头的函数中的this会继承它宿主环境中的this

  1. var obj={
  2. fn:function(){
  3. //=>this:obj
  4. setTimeout(function(){
  5. //=>this:window 不管在哪执行,定时器中的this是window
  6. },1000);
  7. //=>想让定时器函数中的this也是obj
  8. setTimeout(function(){
  9. //=>this:obj
  10. }.bind(this),1000);
  11. var _this=this;
  12. setTimeout(function(){
  13. //=>_this:obj
  14. _this.name='xxx';
  15. },1000);
  16. setTimeout(()=>{
  17. //=>this:obj 箭头函数中的this继承宿主环境中的this
  18. },1000);
  19. }
  20. };
  21. obj.fn();

在JS严格模式下

  1. "use strict"; //=>代码第一行加上这句话,就开启了JS中的严格模式
  2. function fn(){
  3. "use strict";//=>只在当前私有作用域中使用严格模式(也需要处于当前作用域第一行)
  4. }

非严格模式下不明确执行主体,浏览器认为执行主体默认是window(this一般都是window);但是在严格模式下,执行主体不明确,this是undefined;

  1. "use strict";
  2. ~function(){
  3. //=>this:undefined
  4. }();
  5. fn();//=>this:undefined
  6. window.fn();//=>this:window
  7. fn.call();//=>this:undefined
  8. fn.call(window);//=>this:window
  9. fn.call(null/undefined);//=>this:null/undefined

发表评论

表情:
评论列表 (有 0 条评论,316人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JS继承方式

    1.原型继承 核心:将父类的实例作为子类的原型(并不是把父类中的属性和方法克隆一份一模一样的给子类,而是让子类父类之间增加了原型链接) 特点:父类中私有的和公有的都继

    相关 js创建对象方式

    1、字面量方式创建,也就是我们所常说的基本创建方式     但是这个方式有一个缺点,就是要创建多个对象的时候,需要每一个对象里面的属性都要重新声明一下,直接向中添加属性和方法

    相关 JSthis使用情况

    this关键字是JavaScript中最复杂的机制之一,它是一个很特别的关键字,被自动定义在所有函数的作用域中。 在函数中this到底取何值, 是在函数真正被调用执行的时候