JavaScript-找出参数的来源

时间:2018-12-09 16:51:55

标签: javascript reactjs

我的代码中没有几个函数,很难调试,例如,我需要一些帮助

fileName

当我查看控制台时(我经常使用chrome),我总是从第x行获得结果(x是我注销该值的行,在这种情况下为第1行),因此, 有什么办法找出物品的来源吗?结果将是类似

var p = item => {console.log(item)}
var f1 = () => {return p(1)}
var f2 = () => {return p(2)}
var f3 = () => {return p(3)}


编辑: 你们认为我可以操纵`result is ${item} and it is from function ${functionName}` 中的prototype吗?
或者我可以对arguments做些什么?

3 个答案:

答案 0 :(得分:2)

除非告诉您,否则您无法真正知道呼叫者是谁。您可以附加一个参数并传递数据。

var p = (item, source) => console.log(`item: ${item}, source: ${source.name}`)

var f1 = () => {return p(1, f1)}
var f2 = () => {return p(2, f2)}
var f3 = () => {return p(3, f3)}


f1()
f2()
f3()

您的示例非常少,所以我不确定这是否是一个好选择,但是您可以合并对象来保持状态,然后知道调用对象的方法而不是调用者:

function someFn(item, name){
    this.item = item
    this.name = name
}
someFn.prototype.p = function(){
   console.log(`item: ${this.item}, source: ${this.name}`)

}
var f1 = new someFn(12, "someName")
var f2 = new someFn(100, "someOtherName")

f1.p()
f2.p()

答案 1 :(得分:2)

概念:

您可以创建一个Error对象,并使用其stack提取函数名称(以regex为例)。这是概念:

let p = item => {
  let err = new Error();

  console.log(`result is ${item} and the callstack is ${err.stack}`);
};

let f1 = () => p(1);
let f2 = () => p(2);
let f3 = () => p(3);

f1();
f2();
f3();

p(5);

工作示例:

堆栈的第三行是调用函数p的代码。您可以使用正则表达式提取名为p的函数的名称。这是非常基本的正则表达式:

let p = item => {
  let stackLines = new Error().stack.split("\n");
  let callLocation = stackLines[2].match(/\s*at\s*(.+)/)[1];

  console.log(`result is ${item} and it is from "${callLocation}"`);
};

let f1 = () => p(1);
let f2 = () => p(2);
let f3 = () => p(3);

f1();
f2();
f3();

p(5);

它还给出了函数的位置(脚本文件,行和列)。

答案 2 :(得分:2)

使用console.trace()而不是console.log()。