为什么这个函数不能修改最终输出?

时间:2015-03-20 11:42:40

标签: javascript function

我正在做一些简单的事情:读取文件,替换字符,然后输出修改后的内容:

#!/usr/bin/env node

var fs = require('fs')
  , filename = process.argv[2]

if (process.argv.length < 3) {
  console.log('Usage: node ' + process.argv[1] + ' FILENAME')
  process.exit(1)
}

function replaceCharacters(data) {
  data = data
    .replace(/"(?=\b|\*|')/g, '“')

  console.log(data)
}

function saveHtml(data) {
  fs.writeFile("untitled.html", data, function(err) {
    if (err)
      console.log(err)
    else
      console.log(data)
  })
}

fs.readFile(filename, 'utf8', function(err, data) {
  if (err) throw err

  replaceCharacters(data)

  saveHtml(data)
})

问题是,replaceCharacters不影响最终输出。而不是卷曲的开头报价,我仍然得到直的。

我做错了什么?

(如果将内容从replaceCharacters移至fs.readFile,则引号会替换。)

修改

值在函数console.log(data)内发生变化,输出带有引号的数据。

1 个答案:

答案 0 :(得分:5)

它取代了它们,但从未返回它取代的内容:

function replaceCharacters(data) {
  data = data
    .replace(/"(?=\b|\*|')/g, '“')

  console.log(data)

  return data; // <====
}

然后当你使用它时:

    data = replaceCharacters(data)
//  ^^^^^^^

您似乎知道,replace会在替换时创建一个 new 字符串,但它不会更新字符串。 (不可能,JavaScript中的字符串是不可变的。)在replaceCharacters函数中,您要使用结果更新data参数,但这并不会更改调用replaceCharacters的变量,只是函数调用中的参数。因此,您必须在 data = data.replace(...)函数中编写replaceCharacters ,您必须从您的replaceCharacters函数返回结果,使用该返回值。