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

    正文概述 掘金(瑟曦爱唐僧)   2021-05-30   581

    node 中的this 是什么?

    和浏览器里面不同的地方:

    创建 main.js

       function test() {
          this.names = "anikin";
        }
        this.names = 'zhangsan';
        test();
        
        console.log(this, this.name)  // {}  zhangsan
        console.log(global.names) // aninkin
        
         // 在打印一下看看这个this指向哪里呢
         console.log(this === module.exports); // true
    

    通过上面的代码分析得出几个结论:

    • 函数里面的this指向的是全局的 global
    • 整个运行文件里面的 this是指向 module.exports的。这个可以参考模块化原理。

    我们都知道 exports = module.exports ,是存在引用关系的,内存引用一般也是服从堆栈调用的规则。因此我们可以使用this来验证一下。

    js 里面很基础的引用关系。

    var a = { name: "anikin" };
    var b = a;
    a = { age: 23 };
    
    console.log(a, b); 
    

    输出结果是: { age: 23 } { name: "anikin" }

    所以验证下上面的exports的关系。新建文件test.js:

    
    console.log(this === exports);  // true
    console.log(this === module.exports); // true
    
    //
    exports.c = 3;
    module.exports = {
      a: 1,
      b: 2,
    };
    this.m = 5;
    
    console.log(this);  
    console.log(this === exports);
    console.log(this === module.exports);
    console.log(module.exports);
    
    

    以此输出结果是:

     { c: 3, m: 5 }
    true
    false
    { a: 1, b: 2 }
    
    

    解释:在读取文件的时候,内部会调用访问文件函数:__temp.call

    • 在访问模块的时候this指向的是module.exports,而module.exports为一个空对象,exports = module.exports;所以为什么开头一开始问什么打印的全部都是空对象,require函数返回的是module.exports,此时返回的是一个空对象{}

    • exports值也是空对象{},当给exports赋值时:exports.c=3;此时值为一个引用值,相当于改变了堆地址内的值,但是引用堆房间的地址不变,所以修改exports的值module.exports也会改变,还是空对象{c:3},此时的this也是{c:3}

    • module.exports={a:1,b:2};现在是改变了值,就相当于在堆中创建了一个新地址引用,然后指向新的房间,

    所以this指向的还是原来的引用,故thismodule.exports不相等,但是thisexports还是相等的

    和浏览器相同的点:

    类似对象,类,已经箭头函数等的this可以参考浏览器端的实现。

    例如箭头函数:this是在定义函数时绑定的,不是在执行过程中绑定的。简单的说,函数在定义时,this就继承了定义函数的对象。

    const Events = require("events");
    class MyEvent extends Events {}
    var e1 = new MyEvent();
    
    e1.on("start", function () {
      console.log("start:event ", this, this === e1);
    });
    
    e1.on("start", () => {
      console.log("start:event ", this, this === e1);
    });
    
    e1.emit("start", "anikin");
    

    执行结果是:

     anikin MyEvent true
     {} false
    

    起源地下载网 » node 中的this 是什么?

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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