美文网首页
Node之基础全局作用域及全局函数

Node之基础全局作用域及全局函数

作者: 27亿光年中的小小尘埃 | 来源:发表于2019-12-24 15:13 被阅读0次

全局对象

global

setTimeout函数与clearTimeout函数,setInterval函数与clearInterval函数

与浏览器端相似

不同点:

  • 定时器对象的unref方法:可以取消定时器的函数调用
  • 定时器对象的ref方法:可以重新启用定时器的函数调用

使用require函数加载模块

var foo = require('../foo.js');
//
或
varhttp = require('http');

require.main

在Node.js中,定义了一个require.main变量,用于检测一个模块是否为应用程序中的主模块。使用方法如下所示(需要将这段代码书写在被检测的模块文件内部)。

if(module === require.main) {
    console.log('这是应用的主模块');
}

使用require.resolve函数查询完整模块名

使用require.resolve函数来查询某个模块文件的带有完整绝对路径的文件名

require.resolve('./testModule.js');

require.cache对象

require.cache对象,代表缓存了所有已被加载模块的缓存区。

__filename变量与__dirname变量

用于获取当前模块文件名的__filename变量与用于获取当前目录名的__dirname变量。

在任何模块文件内部,可以使用__filename变量获取当前模块文件的带有完整绝对路径的文件名。

在任何模块文件内部,可以使用__dirname变量获取当前模块文件所在目录的完整绝对路径。

EventEmitter类

在Node.js的用于实现各种事件处理的event模块中,定义了一个EventEmitter类。所有可能触发事件的对象都是一个继承了EventEmitter类的子类的实例对象,在Node.js中,为EventEmitter类定义了许多方法,所有与对象的事件处理函数的绑定及解除相关的处理均依靠这些方法的调用来执行。

方法名与参数 描述
addListener(event,listener) 对指定事件绑定事件处理函数
on(event,listener) 对指定事件绑定事件处理函数(addListener方法的别名)
once(event,listener) 对指定事件只执行一次的事件处理函数
removeListener(event,listener) 对指定事件解除事件处理函数
removeAllListener([event]) 对指定事件解除所有事件处理函数
setMaxListeners(n) 指定事件处理函数的最大数量。n为整数值,代表最大的可指定事件处理函数的数量
listener(event) 获取指定事件的所有事件处理函数
emit(event,[arg],[arg2],[...]) 手工触发指定事件

使用on方法绑定事件

var http = require('http'); //引用http模块
var server = http.createServer(); //创建http服务器并将该服务器赋值给变量server
    //为server服务器在接收到客户端请求时触发的request事件绑定事件处理函数
    server.on('request', function(req,res) {
    console.log(req.url);
    res.end();
});
server.listen(1337, "127.0.0.1");

对同一个事件绑定多个事件处理函数

var http = require('http'); //引用http模块
var server = http.createServer(); //创建http服务器并将该服务器赋值给变量server
//为server服务器在接收到客户端请求时触发的request事件绑定事件处理函数
server.on('request', function (req, res) {
  console.log('收到客户端请求');
  res.end();
});
server.on('request', function (req, res) {
  if (req.url !== "/favicon.ico") {
    console.log(req.url);
  }
  res.end();
});
server.on('request', function (req, res) {
  if (req.url !== "/favicon.ico")
    console.log(' 发送响应完毕。');
  });
server.listen(1337, "127.0.0.1");

设定最多可以指定的事件处理函数数量

setMaxListeners方法使用一个整数值参数,代表最多可以指定的事件处理函数数量。

emitter.setMaxListeners(1)

取得指定事件的所有事件处理函数

listeners方法使用一个参数,参数值为指定事件名。该方法返回由该事件的所有事件处理函数构成的数组。

emitter.listeners(event)

使用once方法绑定事件

用法跟on绑定事件是一样的,once会当事件处理函数执行一次后立即被解除,即该事件处理函数只会被执行一次。

var http = require('http'); //引用http模块
var server = http.createServer(); //创建http服务器并将该服务器赋值给变量server
//为server服务器在接收到客户端请求时触发的request事件绑定事件处理函数
server.setMaxListeners(10)
server.once('request', function (req, res) {
  console.log('收到客户端请求');
  res.end();
});
server.on('request', function (req, res) {
  if (req.url !== "/favicon.ico") {
    console.log(req.url);
  }
  res.end();
});
server.once('request', function (req, res) {
  if (req.url !== "/favicon.ico")
    console.log(' 发送响应完毕。');
  });
server.listen(1337, "127.0.0.1");

移除指定事件的事件处理函数

在removeAllListeners方法中,可以使用一个参数,参数值为需要被解除事件处理函数的事件名。

var http = require('http'); //引用http模块
var server = http.createServer(); //创建http服务器并将该服务器赋值给变量server
//为server服务器在接收到客户端请求时触发的request事件绑定事件处理函数
server.setMaxListeners(10)
server.once('request', function (req, res) {
  console.log('收到客户端请求');
  res.end();
});
let testFuntion = function (req, res) {
  if (req.url !== "/favicon.ico")
    console.log(' 发送响应完毕。');
  }
server.on('request', function (req, res) {
  if (req.url !== "/favicon.ico") {
    console.log(req.url);
  }
  res.end();
});
server.on('request', testFuntion);
server.removeListener('request',testFuntion)
server.listen(1337, "127.0.0.1");

在removeAllListeners方法中使用事件名参数时,将取消该事件的所有事件处理函数;如果在removeAllListeners方法中不使用事件名参数时,将取消所有已被指定的事件。


var http = require('http'); //引用http模块
var server = http.createServer(); //创建http服务器并将该服务器赋值给变量server
//为server服务器在接收到客户端请求时触发的request事件绑定事件处理函数
server.setMaxListeners(10)
server.once('request', function (req, res) {
  console.log('收到客户端请求');
  res.end();
});
let testFuntion = function (req, res) {
  if (req.url !== "/favicon.ico")
    console.log(' 发送响应完毕。');
  }
server.on('request', function (req, res) {
  if (req.url !== "/favicon.ico") {
    console.log(req.url);
  }
  res.end();
});
server.removeAllListeners('request');
server.on('request', testFuntion);
server.listen(1337, "127.0.0.1");

emit手动触发事件

当你需要手工触发某个对象的一个事件时,可以使用EventEmitter类的emit方法,在emit方法中可以使用一个或多个参数,其中第一个参数值为需要手工触发的事件名,从第二个参数开始为需要传递给事件处理函数的参数。

var http = require('http'); //引用http模块
var server = http.createServer(); //创建http服务器并将该服务器赋值给变量server
//为server服务器在接收到客户端请求时触发的request事件绑定事件处理函数
server.setMaxListeners(10)
server.once('request', function (req, res) {
  console.log('收到客户端请求');
  res.end();
});
let testFuntion = function (arg1, arg2) {
 console.log(arg1, arg2);
 
}
server.on('request', function (req, res) {
  if (req.url !== "/favicon.ico") {
    console.log(req.url);
  }
  res.end();
});
server.on('emit', testFuntion);
server.emit('emit',1,2)

server.listen(1337, "127.0.0.1");

获取指定事件的事件处理函数的数量

EventEmitter类自身拥有一个listenerCount方法,可用来获取某个对象的指定事件的事件处理函数的数量,在listenerCount方法中,使用两个参数,其中第一个参数用于指定需要获取哪个对象的事件处理函数的数量,第二个参数用于指定需要获取哪个事件的事件处理函数的数量。

var http = require('http'); //引用http模块
var events = require('events'); //引入events模块
var server = http.createServer(); //创建http服务器并将该服务器赋值给变量server
//为server服务器在接收到客户端请求时触发的request事件绑定事件处理函数
server.setMaxListeners(10)
server.on('request', function (req, res) {
  // res.end();
});
let testFuntion = function (req, res) {
  console.log(events.EventEmitter.listenerCount(server,'request'));
  
  res.end(`${events.EventEmitter.listenerCount(server,'request')}`);
}
server.on('request', function (req, res) {
  if (req.url !== "/favicon.ico") {
    console.log(req.url);
  }
  // res.end();
});
server.on('request', testFuntion);
server.listen(1337, "127.0.0.1");

EventEmitter类自身所拥有的事件监听newListener事件及removeListener事件

var http = require('http'); //引用http模块
var server = http.createServer(); //创建http服务器并将该服务器赋值给变量server
server.on('removeListener',function(e,f){
  console.log("对"+e+"事件取消事件处理函数");
  console.log(f);
});
server.on('newListener',function(e,f){
  console.log("对"+e+"事件添加事件处理函数");
  console.log(f);
});
var testFunction=function(req,res) {
if(req.url!=="/favicon.ico")
  console.log('发送响应完毕。');
};
//为server服务器在接收到客户端请求时触发的request事件绑定多个事件处理函数
server.on('request', function(req,res) {
  if(req.url!=="/favicon.ico")
  console.log('接收到客户端请求');
});
server.on('request', function(req,res) {
  if(req.url!=="/favicon.ico"){
    console.log(req.url);
  }
  res.end();
});
server.on('request',testFunction);
server.removeListener('request',testFunction);
server.listen(1337, "127.0.0.1");

相关文章

  • Node之基础全局作用域及全局函数

    全局对象 global setTimeout函数与clearTimeout函数,setInterval函数与cle...

  • JS基础---05作用域

    JavaScript基础 1 - 作用域 1.1 作用域概述 全局作用域 局部作用域(函数作用域) 1.2 全局作...

  • Scope

    1. 全局作用域 全局变量拥有全局作用域 2. 函数作用域 在函数内声明的变量用于函数作用域。在函数体内,局部变量...

  • JS的作用域

    JS的作用域: 全局作用域、函数作用域、eval 作用域、块级作用域 全局作用域: 函数作用域: 结果截屏: 说...

  • 作用域和作用域链

    变量的作用域包括两种:全局作用域和局部作用域全局作用域:最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,...

  • js 变量作用域问题 以及 let

    JavaScript中有以下两种作用域 全局作用域函数作用域全局作用域是函数之外(最外层代码)的作用域。在函数之外...

  • js作用域

    1 - 作用域 1.1 作用域概述 全局作用域 局部作用域(函数作用域) 1.2 全局作用域 1.3 局部作用域 ...

  • 作用域,作用域链

    1 - 作用域 1.1 作用域概述 全局作用域 局部作用域(函数作用域) 1.2 全局作用域 1.3 局部作用域 ...

  • 【前端学习笔记】JavaScript的 作用域与变量提升。

    作用域(scope) 在ECMAScript中,JavaScript只有两类作用域:全局作用域、函数作用域。 全局...

  • javascript的三种作用域

    javascript 三种作用域 全局作用域 函数作用域 块级作用域(es6) 全局作用域 变量声明不写在函数内部...

网友评论

      本文标题:Node之基础全局作用域及全局函数

      本文链接:https://www.haomeiwen.com/subject/idhfoctx.html