javascript - 确保职能范围

标签 javascript function scope

我编写了一些正在运行的代码,我的下一场战斗是重构,我认为在范围方面我做错了一些事情。我正在检索消息数据并尝试修改它:

function handleMessage(message) {
if(message.includes('dns')) {
    // Take the data I want and re-organize for the API to use
    // This removes the user ID text <@XXXXXXXXX>
    var buf1 = Buffer.allocUnsafe(26);
    buf1 = message;
    buf2 = buf1.slice(13, buf1.length);
    message = buf2.toString('ascii', 0, buf2.length);

    /* There may be a better way with the Slack API, but this will work
    returns URL as a string without extra formatting. Pre-formatted text appears like:
    <http://webbhost.net|webbhost.net> */
    var n = message.indexOf('|');
    var o = message.indexOf('>');
    var n = n+1;
    var o = o-2;
    var s1 = message.substr(n, o);
    var p = s1.indexOf('>');
    var s2 = s1.substr(0, p);
    message = s2;
    dnsLookup(message);

} else if(message.includes(' whois')) {
    // Take the data I want and re-organize for the API to use
    // This should probably be it's own function
    var buf1 = Buffer.allocUnsafe(26);
    buf1 = message;
    buf2 = buf1.slice(13, buf1.length);
    message = buf2.toString('ascii', 0, buf2.length);

    var n = message.indexOf('|');
    var o = message.indexOf('>');
    var n = n+1;
    var o = o-2;
    var s1 = message.substr(n, o);
    var p = s1.indexOf('>');
    var s2 = s1.substr(0, p);
    message = s2;
    whoisLookup(message);
}

显然我在这里重复了很多代码,我想从中创建两个函数。现在我尝试在这个函数中执行此操作,看起来当我将它们设置为函数时,我不会永久更新我发送的变量(当我检查第一个函数的结果和在函数的开头时)其次,它看起来像在第一个函数运行之前)。

我需要用其他方式来看待这个问题吗?我可以将其作为一项功能来完成,但我正在尝试为将来可​​能遇到的其他场景提供保证。

这是我更改后的样子:

function handleMessage(message) {
function removeID(message) {
    var buf1 = Buffer.allocUnsafe(26);
    buf1 = message;
    buf2 = buf1.slice(13, buf1.length);
    message = buf2.toString('ascii', 0, buf2.length);

    console.log(message);
    }
function removeSlackURL(message){
    console.log("test");
    console.log(message);
    var n = message.indexOf('|');
    var o = message.indexOf('>');
    var n = n+1;
    var o = o-2;
    var s1 = message.substr(n, o);
    var p = s1.indexOf('>');
    var s2 = s1.substr(0, p);
    message = s2;

}
if(message.includes('dns')) {
    // Take the data I want and re-organize for the API to use
    // This removes the user ID text <@XXXXXXXXX>


    removeID(message);
    removeSlackURL(message);

最佳答案

每当您通过 message对于一个函数,您将对字符串的引用传递给一个单独的变量,该变量的范围仅限于该函数。如果您将不同的字符串分配给 message函数内的变量,它本质上是将该引用重新分配给新值,而不影响原始的 message以任何方式。 它相当于:

var a = 2;
var b = a; //b = 2
b = 3;
console.log(a); //2

a这是你原来的message它被传递给一个名为 message 的变量在类似于 b 的函数内在这里。

保持更改的最佳方法是从所有函数返回最终修改后的字符串,并使用返回值替换初始值。

function handleMessage(message){
  function removeID(message){
     ....
     ....
     return buf2.toString('ascii', 0, buf2.length);
  }

  function removeSlackURL(message){
     console.log("test");
     console.log(message);
     var n = message.indexOf('|');
     var o = message.indexOf('>');
     var n = n+1;
     var o = o-2;
     var s1 = message.substr(n, o);
     var p = s1.indexOf('>');
     var s2 = s1.substr(0, p);
     message = s2;
     return message;
  }

  if(message.includes('dns')) {
      // Take the data I want and re-organize for the API to use
      // This removes the user ID text <@XXXXXXXXX>


      message = removeID(message);
      message = removeSlackURL(message);

  ....
  ....
  return message;
}

关于javascript - 确保职能范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51852643/

相关文章:

javascript - 安排工作在其他事件触发后进行

javascript - 如何访问函数/类属性javascript

r - 将 dplyr 方法作为函数参数传递

angularjs - 使用 AngularJS 实现文本大小 slider

node.js - "describe"和 "it"语句内的变量范围

javascript - 了解 crossdomain.xml 和恶意脚本?

javascript - 在对象名称中使用 Javascript 变量?

javascript - 如何删除输入框中的内容

excel - Excel中的MID + LEN函数用于提取具有不一致模式的字母+数字

ruby - 如何访问 IRB 所需的 Ruby 文件中定义的变量?