最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JS中的this指向

    正文概述 掘金(小_小陳)   2021-08-04   580

    这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

    this作为Javascript语言中的一个关键字。它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。简言之,this是用来指向对象。今天就一下几方面学习一下this

    一般函数

    独立函数调用,this指向全局对象

    var a = 'foo';
    function foo(){
        console.log(this.a);
    }
    foo();  //foo
    

    这里函数foo()中的this指向全局对象。

    严格模式,this绑定undefined

    var a = 'foo';
    function foo(){
        'use strict'
        console.log(this.a);
    }
    foo();  //TypeError: Cannot read property 'a' of undefined
    

    在严格模式下,foo()this指向undefined,所以报错。

    箭头函数

    var a = 'foo';
    var obj = {
        a : 1,
        foo : ()=>{console.log(this.a)}
    
    };
    obj.foo(); //foo (use strict : foo)
    

    箭头函数体内的this对象,就是定义该函数时所在的作用域指向的对象,而不是使用时所在的作用域指向的对象.

    对象

    function foo(){
    console.log(this.a);
    }
    var obj1 = {
    a : 1,
    foo : foo
    };
    var obj2 = {
    a : 2,
    obj1 : obj1
    };
    obj2.obj1.foo(); //1
    
    var a = 'foo';
    function foo(){
    console.log(this.a);
    }
    var obj = {
    a : 2,
    foo : foo
    };
    var bar = obj.foo;
    bar(); //foo
    
    var a = 'foo';
    function foo(){
    console.log(this.a);
    }
    function doFoo(fn){ //fn = obj.foo  隐式赋值
    fn();
    }
    var obj = {
    a : 2,
    foo : foo
    };
    doFoo(obj.foo);  //foo
    

    练习题


    题1

    严格模式下

    'use strict'
    var a = 10;
    function foo(){
        console.log('this1',this);
        console.log(window.a);
        console.log(this.a);
    }
    console.log(window.foo);
    console.log('this2',this);
    foo();
    

    结果:

    f foo(){...}  
    this2 Window{...}  
    this1 undefined  
    10  
    TypeError: Cannot read property 'a' of undefined  
    

    题2

    let a = 10;
    const b = 20;
    
    function foo(){
        console.log(this.a); //undefined
        console.log(this.b); //undefined
    }
    console.log(window.a); //undefined
    foo();
    

    题3

    var name = 'windowsName';
    function sayName(){
        var name = 'Jake';
        console.log(this.name);  //windowsName  (严格模式下:TypeError)
        console.log(this); //Window
    }
    sayName(); //window.sayName()
    console.log(this); //Window
    

    function this对于函数中this:运行时this永远指向最后调用它的那个对象


    题4

    function foo(){
        console.log(this.age);
    }
    
    var obj1 = {
        age : 23,
        foo : foo
    };
    
    var obj2 = {
        age : 18,
        obj1 : obj1
    };
    
    obj2.obj1.foo(); //23
    

    最后调用foo()的是obj1,所以this指向obj1


    题5

    隐式绑定的隐式丢失问题 第一种:使用另一个变量给函数取别名会发生隐式丢失

    function foo(){
        console.log(this.a)
    };
    var obj = { a : 1, foo};
    var a = 2;
    var foo2 = obj.foo;
    
    obj.foo(); //1
    foo2();  //2
    

    第二种:

    function foo(){
        console.log(this.a)
    }
    var obj = {a:1,foo};
    var obj2 = {a:3, foo2: obj.foo};
    obj2.foo2(); //3
    

    第三种:

    function foo(){
        console.log(this.a)
    }
    function doFoo(fn){
        console.log(this);  //window
        fn();
    }
    var obj = {a:1,foo}
    var a = 2;
    doFoo(obj.foo);  //2
    

    题6

    构造函数中的this
    new的过程

    var a = new Foo("zhang","jake");
    
    new Foo{
        var obj = {};
        obj.__proto__ = Foo.prototype;
        var result = Foo.call(obj,"zhang","jake");
        return typeof result === 'obj'?result:obj;
    }
    

    new的过程如下:

    var name = 'Jake';
    function testThis(){
        this.name = 'jakezhang';
        this.sayName = function (){
            return this.name;
        }
    }
    console.log(this.name);  //Jake
    
    new testThis();
    console.log(this.nam);  //Jake
    
    var result = new testThis();
    console.log(result.name);  //jakezhang
    console.log(result.sayName());  //jakezhang
    
    testThis();
    console.log(this.name);  //jakezhang
    

    题7

    function foo(){
        console.log(this.a);  //1
        bar.apply({a:2},arguments);
    }
    function bar(b){
        console.log(this.a + b); //5
    }
    var a = 1;
    foo(3);
    

    call、apply、bind都可以改变函数的this指向


    题8

    var name = 'window'
    var obj1 = {
      name: 'obj1',
    
      foo1: function () {
        console.log(this.name)
        return () => {
          console.log(this.name)
        }
      },
    
      foo2: () => {
        console.log(this.name)
        return function () {
          console.log(this.name)
        }
      }
    }
    
    
    var obj2 = {
      name: 'obj2'
    }
    obj1.foo1.call(obj2)() //2 2
    obj1.foo1().call(obj2)  //1 1
    obj1.foo2.call(obj2)()  //window window
    obj1.foo2().call(obj2)  //window 2
    

    箭头函数中的this


    起源地下载网 » JS中的this指向

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元