Node.js从无到有-No.5(http源码解读)

1、HTTP源码解读

1、在阅读http源码之前我们要了解什么是作用域,什么是上下文

2、作用域和调用函数,访问变量的能力有关,上下文和this有关,是调用当前可执行代码的引用

3、作用域分为局部作用域和全局作用域,处于局部作用域可以访问到全局作用域,在全局作用域却访问不到局部作用域

4、如果在浏览器中,我们的顶层的全局变量就是window,在node中我们的顶层全局变量就是global

5、上下文常常代表this变量的值以及指向,它决定一个函数怎么被调用,当一个函数被作为一个对象的方法被调用,this就指向调用这个方法的对象

var pet={
    words:'...',
    speak:function(){
        console.log(this.words)
        console.log(this===pet)  
    }
}

pet.speak()

很明显,在这种情况下,我们的this就指的是这个对象pet

function pet(words){
    this.words=words;
    console.log(this.words)
    console.log(this) //这里的this就不是pet了,而是上一层的顶层全局变量,由于是在node环境下,则为global
}

pet('...')

上面这个代码我们就很明显的看出来,这个this就不是pet,如果去运行这段代码就会发现打印出来的this是一堆东西,如下图


function Pet(words){
    this.words=words
    this.speak=function(){
        console.log(this.words)
        console.log(this)
    }
}

var cat=new Pet('miao')
cat.speak()

再来看这段代码,我们的speak函数被作为cat这个对象的方法进行调用,那么speak函数中的this就指的cat对象,请在仔细的读读这句话,我们看看上段代码的演示结果


所以this指向了cat,cat是一个Pet的对象实例,包含了pet中的words和speak两个属性

总结上下文:this指向当前函数的拥有者,拥有者就叫做执行上下文

6、call apply的使用可以改变上下文的执行对象,通俗的说就是改变this指向的内容,只不过两者的用法有所区别。call函数需要一个参数列表,apply允许传递一个参数作为数组,下面用段代码来演示

var pet={
    words:'...',
    speak:function(say){
        console.log(say+' '+this.words)
    }
}

var dog={
    words:'wang'
}

pet.speak.call(dog,'Speak')
我们在调用pet.speak方法的时候,this毫无疑问指向pet这个对象,那么使用call方法我们就把pet.speak方法中的this指向了dog,可以看一下执行结果,效果就是dog对象即使没有speak这个属性,也能调用这个方法 


7、call apply方法能改变this上下文的这种特性也能方便实现继承

function Pet(words){
    this.words=words,
    this.speak=function(){
        console.log(this.words)
    }
}
function Dog(words){
    Pet.call(this,words)
    //Pet.apply(this,argument)
}

var dog=new Dog('wang')
dog.speak()

在上面这个代码中我们Dog本身是没有speak方法的,当时通过Pet.call(this)这种方法使Pet中所有this指向了Dog中的this,从而使Dog也能使用Pet中的属性,实现了Dog继承了Pet。

8、之前在初识node.js那篇文章中我们就起了一个服务器,我们重新在写一下这个代码

var http=require('http')
http.createServer(function(req,res){
    res.writeHead(200,{'Content-Type':'text/plain'})  //响应头
    res.write('hello world\n')//响应主体
    res.end()//响应结束
}).listen(2015)

为了能深入了解这段代码的意思我们就要去看源码了,首先我们进入官网去查找node,来到查找node的结果页面,点击第一个就是node的开源项目网页,按下快捷键T进行搜索,搜索http.js,进入第一个文件(如果以上操作大家有问题可以直接进入这个网址https://github.com/nodejs/node/blob/master/lib/http.js来直接看代码,不过还是建议去查找一下)

猜你喜欢

转载自blog.csdn.net/weixin_37968345/article/details/80766774
今日推荐