如何知道何时从控制台调用 JavaScript 函数? [复制]

Posted

技术标签:

【中文标题】如何知道何时从控制台调用 JavaScript 函数? [复制]【英文标题】:How to know when a JavaScript function is called from a console? [duplicate] 【发布时间】:2016-01-09 08:08:31 【问题描述】:

我希望特定 javascript 函数的行为有所不同,具体取决于它是在从 html 页面引用的 JavaScript 代码中调用还是从控制台中调用。这可能吗?类似于以下内容:

function mySpecialFunc() 
  if (inConsole())
    console.log("You called me from the console!");
  else
    console.log("You called me from an HTML page or a JavaScript file linked from an HTML page, I think.");

是否存在与上述inConsole() 函数等效的东西?

这是否至少仅适用于 Chrome 或 Firefox?

【问题讨论】:

你无法分辨。 您在控制台中运行的代码实际上被注入到页面的全局范围内,因此您无法真正区分。 你也应该说出原因。您的实际问题可能还有其他解决方案 对于我上面的评论者,请记住,仅仅因为你不能做某事,并不意味着它不能做。 【参考方案1】:

不幸的是,无法通过系统输入来判断,但您可以在某种意义上使用溢出/重载功能“手动”完成。 See here 获取关于如何在 js 中使用溢出/重载的优秀教程。

因此,在您调用 javascript 中的函数的代码中,向调用中添加一个附加参数,该参数将告诉该函数它不是从控制台调用的。

mySpecialFunc() <---- From console
mySpecialFunc(value) <---- From code

【讨论】:

我认为链接的答案与问题无关。 链接不是答案,它是做重载函数的教程。我提出的答案是使用重载函数来解决他的问题。如果他为在程序中调用他的函数的代码添加了一个参数,并为从控制台调用它的代码添加了一组不同的参数(在这种情况下没有),那么就有可能区分代码。【参考方案2】:

一种方法是抛出一个错误并检查堆栈跟踪以查找控制台注入所独有的字符串。类似"InjectedScript"

这是一个有效的例子。

    var f = function()
      var injected;
      try 
        throw new Error();
       catch (e) 
        injected = e.stack.match('InjectedScript');
      
      if (injected) 
        console.log("Called from console");
       else 
        console.log("Called from code");
      
    
    // Add it to window so we can call it from the console.
    window.f = f;
    f();

【讨论】:

可能的错误消息范围可能比您的答案大得多,每个 使用控制台的实现是否在错误中包含确切的短语“InjectedScript”?是在某处指定的吗? 我在标记为重复之前已回答。只有当其他人标记它时,我才意识到以前有人问过它。 很公平。通用策略似乎提供了一个可能的答案,但是从控制台调用的代码的错误消息在不同环境中似乎有所不同,因此需要进行更广泛的测试。以上在IE中不起作用。另外widnow.f = f 是多余的,var f 在执行任何代码之前已经创建了一个全局变量 f 是的,我只是在 chrome 中进行测试,所以这就是我得到的错误消息。可能应该在答案中提到这一点,但是,无论如何,标记的副本要好得多。

以上是关于如何知道何时从控制台调用 JavaScript 函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 中的反向 while 循环如何知道何时停止?

JavaScript函数调用

我们如何知道函数是从控制台调用还是从源代码调用

如何知道 Fragment 何时变得不可见

如何知道 jquery $.get ajax 调用何时完成?

如何使 libcurl C++ 调用超时和/或知道调用中何时发生超时