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来直接看代码,不过还是建议去查找一下)