Node.js(七)——HTTP作用域、上下文

http源码解读

什么是作用域?

作用域和调用函数访问变量的能力有关

作用域分局部作用域和全局作用域,同时作用域往往和变量有关系,

处在局部作用域里面可以访问到全局作用域的变量,反之则访问不到

实例如下:

var globalVariable = ‘This is global variable‘

function globalFunction(){
	var localVariable =‘This is local variable‘

	console.log(‘Visit global/local variable‘)
	console.log(globalVariable)
	console.log(localVariable)

	globalVariable = ‘This is changed variable‘
	console.log(globalVariable)

	function localFunction(){
		var innerLocalVariable = ‘This is inner local variable‘

		console.log(‘Visit global/local/inner variable‘)
		console.log(globalVariable)
		console.log(localVariable)
		console.log(innerLocalVariable)
	}
	localFunction()
}

globalFunction()

执行结果如下:

什么是上下文?

this关键字有关,是调用当前可执行代码的引用

常常代表this变量的值以及它的指向,它决定一个函数怎么被调用,当这个函数作为一个对象的方法被调用时this总是指向调用这个方法的对象

代码如下:

第一种

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

pet.speak()

执行结果如下:

第二种:

function pet(words){
	this.words = words
	console.log(this.words)

	//这个this指向顶层的global对象
	console.log(this ===  global)
}

pet(‘...‘)

执行结果如下:

第三种:

function Pet(words){
	this.words = words
	this.speak = function(){
		console.log(this.words)
		//此时的this指向的谁?cat对象
		console.log(this)
	}
}

var cat = new Pet(‘Miao‘)
cat.speak()

执行结果如下:

提出上下文是为了引出函数所拥有的两个方法:call和apply,可以改变上下文执行对象,可以在自定义上下文中执行函数,作用是一样的

只是用法有区别

call函数需要一个参数列表,apply允许你传递一个参数作为数组,具体的是作用呢是调用一个对象的方法以另一个对象替换当前对象,其实就是更改当前对象的this指向的内容,标准一点就是:以某个方法当做指定某个对象的方法被执行

示例如下:

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

//pet.speak(‘Speak‘)
var dog = {
	words:‘Wang‘
}

//让dog也能有speak方法
pet.speak.call(dog,‘Speak‘)

运行结果如下:

利用call和apply可以方便的实现继承

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

function Dog(words){
	Pet.call(this,words)
	//Pet.apply(this,arguments)
}

//通过new生成实例对象
var dog = new Dog(‘Wang‘)
dog.speak()

运行结果如下:

这就是call和apply的用法

时间: 2024-08-01 22:43:29

Node.js(七)——HTTP作用域、上下文的相关文章

node.js(七) 子进程 child_process模块

众所周知node.js是基于单线程模型架构,这样的设计可以带来高效的CPU利用率,但是无法却利用多个核心的CPU,为了解决这个问题,node.js提供了child_process模块,通过多进程来实现对多核CPU的利用. child_process模块提供了四个创建子进程的函数,分别是spawn,exec,execFile和fork. 1.spawn函数的简单用法 spawn函数用给定的命令发布一个子进程,只能运行指定的程序,参数需要在列表中给出.如下示例: var child_process

node.js初步了解(3)——慕课网(回调,作用域,上下文)

1. 1 //回调:回调是异步编程最基本的方法,node.js需要按顺序执行异步逻辑的时候,一般采用后续传递的方式,将后续逻辑封装在回调函数中,作为起始函数的参数. 2 //具名函数 3 function learn(something){ 4 console.log(something); 5 } 6 7 function we(callback,something){ 8 something+=' is cool'; 9 callback(something); 10 11 } 12 13

Node.js 切近实战(七) 之Excel在线(文件&文件组)

最近西安的天气真他妈的热,感觉还是青海的天气美,最高温28度.上周逛了青海湖,感觉还是意犹未尽,其实我还是很喜欢去一趟西藏的,但是考虑到花费也没人陪我,我暂时放弃这个念头.计划去一下重庆或者甘南,也许是现实的. OK,废话不多说,今天我们来看一下Excel在线部分的文件和文件组.首先我们来看一下页面,调一下胃口.俗话说无图无真相,先看图. 没错,还是Telerik Kendo UI,其实我面试的时候当听到别人说自己用的是EasyUI和ExtJs的时候,我就不那么上心,但是如果有人用的是Kendo

《饿了么大前端 Node.js 进阶教程》—Javascript 基础问题—作用域

<饿了么大前端 Node.js 进阶教程>地址:https://github.com/ElemeFE/node-interview 作用域从某种意义上来说是个难点,它需要你真真正正的了解JS的分词.词法分析,语法分析,代码生成,LHS查询,RHS查询等深层的东西. 如果不知道可以读一下<你不知道的JavaScript:上卷> let和var的区别 1.let只在声明的代码块中有效,{}中使用let声明变量,外面是访问不到的,这就是块级作用域 2.不存在变量提升问题 3.重复声明会报

MongoDB for node.js developers 七周学习-最终测试小结(1)

MonogoDB官网上提供了许多免费课程,就选择了"MongoDB for node.js developers"学习.课程当然是英文的啦,不过有中文字幕~,每次课程后还有练习.七周的课程过去的很快,学到了不少的内容.借助着最终测试的题,做一次小结,省得自己不久后忘记(哎,记性差= =) 最后的测试一共有十道题,考察的内容分别是:1.查询 2.聚合 3.更新$addToSet 4.更新$inc 5.索引  6.添加优化 7.游标 8.副本 9.片键 10.索引的explain属性 1.

node.js学习日记(二)node.js的作用域

node.js的作用域 测试package1能否能通过require("./package2")来调用package2内的函数: 1 //paackage1.js 2 var a1 = 1; 3 4 require("./package2"); 5 6 /*即使require了package2,也无法调用函数double_a*/ 7 a1 = double_a(a1);//double_a is not defined 8 9 console.log("p

上传图片到七牛云(服务端 node.js sdk)

大体思路 前端要上传图片到七牛云,需要有一个token进行授权操作,而获取这个上传的upload token(以下简称upToken),在服务端需要一定的身份校验,比如说:只有登录的vip用户才能拿到这个上传的token,才能往七牛云上传图片. 而服务端如何来生成这个upToken呢?以koa2为例,用最简洁的方式生成一个upToken.这里使用的是官方提供的node.js sdk.所谓sdk,就是软件开发工具包. 注意:这里我们上传的大体思路分为两步:第一,服务端颁发上传凭证到前端,前端携带凭

【Node.js学习笔记七】使用package.json

package.json是什么? package.json是定义了一个模块,包括其依赖关系的一个简单的JSON文本文件. 所有Node的模块必须在其根目录下包含一个package.json文件. 以下是一个包含名称.版本.描述和依赖的package.json文件的例子: 1 { 2 "name": "my_module", 3 "version": "0.1.0", 4 "description": &qu

Node.js入门:前后端模块的异同

通常有一些模块可以同时适用于前后端,但是在浏览器端通过script标签的载入JavaScript文件的方式与Node.js不同.Node.js在载入到最终的执行中,进行了包装,使得每个文件中的变量天然的形成在一个闭包之中,不会污染全局变量.而浏览器端则通常是裸露的JavaScript代码片段.所以为了解决前后端一致性的问题,类库开发者需要将类库代码包装在一个闭包内.以下代码片段抽取自著名类库underscore的定义方式. 1 (function () { 2 // Establish the