确定在函数内访问的Javascript变量的所有属性,而不运行它

时间:2017-05-17 14:24:47

标签: javascript functional-programming

有没有一种聪明的方法可以找出函数中引用的对象的所有属性而不执行它?

例如,让我说我有以下功能:

var fun = function(a){
  a.text = "hello world";
  a.title = "greetings";
  a.ran = "fun";
}

我想要一些神奇的功能:

var results = magical_function(fun, {});
// results = ["text", "title", "ran"];

基本上它会返回将在fun函数内访问的参数对象的所有属性,而不必实际执行fun

我说"没有跑步"因为我不希望检查这种行为会影响任何外部应用程序逻辑,但只要检查不会影响外部世界,我就没事了。

3 个答案:

答案 0 :(得分:2)

function.toString()将返回一个可解析的字符串。使用正则表达式。



var fun = function(a){
  a.text = "hello world";
  a.title = "greetings";
  a.ran = "fun";
}

var fun2 = function(x){
  x.text = "hello world";
  x.title = "greetings";
  a.ran = "fun";
}

function magical_function(func) {
  var data = func.toString();

  var r = /a\.([a-z]+)/g;

  var matches = [];
  var match;
  while ((match = r.exec(data)) != null) {
      matches.push(match[1]);
  }

  return matches;
}

function magical_function_2(func) {
  var data = func.toString();
  
  var attribute_finder_r = new RegExp('function \\(([a-z]+)\\)');
  var attribute_name_match = attribute_finder_r.exec(data);
  
  if (!attribute_name_match) {
    throw 'Could not match attribute name';
  }
  
  var attribute_name = attribute_name_match[1];

  var r = new RegExp(attribute_name + '.([a-z]+)', 'g');

  var matches = [];
  var match;
  while ((match = r.exec(data)) != null) {
      matches.push(match[1]);
  }

  return matches;
}

console.log(magical_function(fun));
console.log(magical_function_2(fun2));




答案 1 :(得分:0)

var myObj = {
    text: '',
  title: '',
  ran: ''
}

var fun = function(a){
  a.text = "hello world";
  a.title = "greetings";
  a.ran = "fun";
}

function magical_function(func, obj) {
  var data = func.toString();

    var keys = Object.keys(obj);
    var regExp = '';

    for (let i= 0; i < keys.length; i++) {
    if (keys.length > 1 && ((i+1) < keys.length)) {
        regExp += keys[i] + '|';
    }
    else if (keys.length == 1 || ((i+1) == keys.length)) {
        regExp += keys[i];
    }
  }

  regExp = '\.(['+ regExp +']+)\\s*=';

  var r = new RegExp(regExp, 'g');

  var matches = [];
  var match;
  while ((match = r.exec(data)) != null) {
    if (Object.keys(obj).includes(match[1]))
        matches.push(match[1]);
  }

  return matches;
}

console.log(magical_function(fun, myObj));

答案 2 :(得分:-4)

在运行该函数之前,这些属性无法设置。

你唯一能做的就是编写另一个版本的函数,它只访问传递的对象并返回结果。