phper写nodejs走过的坑

PHP是世界上最好的语言。

写了差不多半年的nodejs,本质上还是在被php的惯性影响。谁叫php写了6年多呢。nodejs让我隐藏了笑话中的尴尬:

你们php程序员是不是想钱想疯了,写的代码里面都那么多$

对const的误解

在php的const一旦定义不可以修改,无论是什么变量。但是nodejs不一样

const a = 1; //不可修改
const b = ['1'];//可以对数组中的元素进行添加、修改、删除
b.push('2');

class instance{
}
const c = new instance;
c.id = '';//可以对实例的属性进行操作

所以在nodejs里面被定义了const的变量,只是不能再用=

块作用域

起初对这个块变量了解没有那么深刻,差不多也就是php中局部变量的意思吧,一个简单的例子让我瞬间感受到了区别

function a() {
    for (let i = 0; i < 10; i++) {}
    i; //会报未定义的错误
}
a();

原来这个i只在 for循环中起到了作用。

变量生存周期

php的大多框架一个请求一个进程,所以对于变量的生存周期很容易理解,而且全局变量是请求间隔离的。但是nodejs的全局变量是不隔离的,为了进行对一个请求的变量进行有效隔离,进而有了上下文的概念。

对于php来说,获取当前用户,我们一般的做法可以用单例模式去保存当前用户。然后在使用的是获取当前单例里面的用户即可。
nodejs里面要是像php一样做,在没有并发的情况下,是没有问题的。为什么?
我们知道实现单例要依赖类的静态变量,而类的静态变量不属于实例。而类的静态变量的生存周期是存在是nodejs程序运行的整个生命期间,作为各个请求都可以访问并可以进行改变的。
举个例子:有A、B两个用户同时发起相同的请求。服务器先收到了A的请求,单例里面记录的用户是A,但在请求里面有一个相对较长时间的数据库操作需要等待,而就在这等待的过程中,单例里面记录的用户变成了B,而A请求还没有结束,而最终导致A操作的记录被记录在了B用户之下。

在nodejs里面实现单例模式特别简单

//在A文件里面,然后在其他文件中引用即可。
class A {
}
module.exports = new A;

题外:其实有上下文这个概念的语言都会面临nodejs这个问题,nodejs并不是特例。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • C 部分 1.static 关键字的作用? 第一个作用:隐藏。 当我们同时编译多个文件时,所有未加static前缀...
    pingui阅读 9,883评论 2 48
  • 前言 这里筑梦师,是一名正在努力学习的iOS开发工程师,目前致力于全栈方向的学习,希望可以和大家一起交流技术,共同...
    筑梦师Winston阅读 26,217评论 80 514
  • 防止SQL注入 简单回答:防止——利用即有的应用、功能,将(恶意)SQL命令发送到到后台数据库引擎。 防止SQL注...
    庆庆_ce88阅读 13,265评论 1 2
  • 防止SQL注入简单回答:防止——利用即有的应用、功能,将(恶意)SQL命令发送到到后台数据库引擎。 防止SQL注入...
    幼稚园靓仔阅读 5,114评论 1 13
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 12,182评论 16 22