【问题标题】:Calling toString on a javascript function returns source code在 javascript 函数上调用 toString 返回源代码
【发布时间】:2011-03-16 15:33:55
【问题描述】:

我刚刚发现,当您在 javascript 函数上调用 toString() 时,如在 myFunction.toString() 中,会返回该函数的源代码。

如果您在 Firebug 或 Chrome 控制台中尝试它,它甚至会为您很好地格式化它,即使是最小化的 javascript 文件也是如此。
我不知道对混淆文件有什么作用。

这样的 toString 实现有什么用?

【问题讨论】:

标签: javascript tostring


【解决方案1】:

它对调试有一些用处,因为它可以让你看到函数的代码。您可以检查一个函数是否被覆盖,以及一个变量是否指向正确的函数。

它对混淆的 javascript 代码有一些用途。如果您想在 javascript 中进行核心混淆,您可以将整个代码转换为一堆特殊字符,并且不留下数字或字母。这种技术在很大程度上依赖于能够通过使用+"" 强制 toString 调用所有内容来访问字母表中的大多数字母

示例:(![]+"")[+[]]f,因为 (![]+"") 的计算结果为字符串 "false",而 [+[]] 的计算结果为 [0],因此您得到 "false"[0],它提取了第一个字母 f

v 这样的一些字母只能通过在像[].sort 这样的本机函数上调用toString 来访问。字母v 对混淆代码很重要,因为它允许您调用eval,它允许您执行任何操作,甚至是循环,而无需使用任何字母。 Here is an example of this.

【讨论】:

  • 也用于代码生成,在运行时直接从源代码编写新脚本
【解决方案2】:

function.ToString - 返回表示函数源代码的字符串。对于 Function 对象,内置的 toString 方法将函数反编译回定义函数的 JavaScript 源代码。

在 Mozilla 上阅读 this

【讨论】:

    【解决方案3】:

    您可以将其用作 Javascript 源代码中多行字符串的实现。

    this blog post by @tjanczuk 中所述,Javascript 的一大不便之处是多行字符串。但是您可以利用 .toString() 和多行 cmets 的语法 (/* ... */) 来产生相同的结果。

    通过使用following function

    function uncomment(fn){
      return fn.toString().split(/\/\*\n|\n\*\//g).slice(1,-1).join();
    };
    

    ...然后您可以按以下格式传入多行 cmets:

    var superString = uncomment(function(){/*
    String line 1
    String line 2
    String line 3
    */});
    

    在原始文章中,注意到Function.toString() 的行为不是标准化的,因此是离散实现的——推荐用于 Node.js(可以依赖 V8 解释器);但是,a Fiddle I wrote seems to work on every browser I have available to me(Chrome 27、Firefox 21、Opera 12、Internet Explorer 8)。

    【讨论】:

    • 请注意,从欧洲计算机制造商协会 (EMC) 脚本 6 开始,或者简称为 ES6,您可以使用所谓的模板字符串编写多行字符串。这些以反引号开始和结束。 (`)
    【解决方案4】:

    一个不错的用例是远程处理。只需将客户端中的函数字符串化,通过网络发送并在服务器上执行。

    【讨论】:

      【解决方案5】:

      您可以使用它从主脚本中定义的函数创建一个 Web Worker:

      onmessage = function(e) {
        console.log('[Worker] Message received from main script:',e.data);
        postMessage('Worker speaking.');
      }
      
      b = new Blob(["onmessage = " + onmessage.toString()], {type: 'text/javascript'})
      
      w = new Worker(window.URL.createObjectURL(b));
      
      w.onmessage = function(e) {
          console.log('[Main] Message received from worker script:' + e.data);
        };
      
      w.postMessage('Main speaking.');
      

      【讨论】:

        【解决方案6】:

        我的用例 - 我有一个节点程序,它处理数据并将交互式报告生成为 html/js/css 文件。为了生成一个 js 函数,我的节点代码调用 myfunc.toString() 并将其写入文件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-24
          • 1970-01-01
          • 2012-03-06
          • 1970-01-01
          相关资源
          最近更新 更多