es6的反引号`${name}`字符串模板是怎么实现的

自己写了一个

var formatString = function(str){
  var re = /\${(.*?)}/g;
  function replacer(match){
      return eval(match.substring(2,match.length-1));
  }
  var result = str.replace(re, replacer)
  return result;
}

但是不能解决eval作用域的问题,eval取不到对应的变量。

究竟这个是怎么实现的?

阅读 9.8k
2 个回答

你应该取对应作用域的变量,而不是用eval来取。
比如:

${ data. name }

如果之前的作用域为this,则这样获得

this[data][name]

我电脑在做系统,暂时无法测试是否可行,不过这个思路是存在的

function replacer(match) {
  var re = /\${(.*?)}/g;
  var obj = re.exec(match);
  obj = obj[1].split('.');
  var value = this;
  obj.forEach(function(name){
    value = value[name];
  });
  return value == this ? '' : value;
}

function formatString(str) {
  var re = /\${(.*?)}/g;
  var newStr = str.replace(re, replacer);
  return newStr;
}

var person = {
  name: 'joe',
  age: 22
};

var format = formatString('my name is ${person.name}, my age is ${person.age}');
console.log(format);

简单写了一下,可能有考虑不周的地方,希望有人看到可以指出。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题