循环遍历脚本本身并更改它

时间:2015-11-04 10:25:24

标签: javascript

我想知道是否有可能在javascript中替换单词的所有实例。比方说,我想用fn替换“function”的所有实例。我知道这样做会使我的函数无用,但这只是举个例子。

所以我的麻烦是, 1。如何在脚本中访问文本?脚本遍历,类似于我们如何遍历节点树。

2. 我认为这样的行为会带来安全风险,是吗?

假设您有这样的脚本:

var x = function () {

    function y () {
       // ...
    }

}

2 个答案:

答案 0 :(得分:1)

您可以使用eval

执行此操作

看看这个:

myScript = "myFunc = function foo() {console.log(9999)}";
eval(myScript);

现在您可以通过myFunc()

运行该功能

这里很有意思。

foo中的名称myScript更改为bar,将号码更改为0000

myScript = myScript.replace("foo", "bar");
myScript = myScript.replace("9999", "0000");
eval(myScript);
myFunc();

函数bar执行并打印0000

还有很多其他方法可以做到这一点。例如,你可以使用JQuery getScript,并且在这个方向上有很大的创造性。

更新

进一步回答......

我想使用变量myFunc

的具体原因

要理解,请运行以下代码段

myScript = "function foo() {console.log(9999)}";
eval(myScript);
myScript = "function bar() {console.log(0000)}";
eval(myScript);

foo();
bar();

现在猜猜我使用myFunc

的原因

答案 1 :(得分:0)

您可以像访问任何其他元素一样访问script元素。但是,它只包含一个文本节点,即脚本本身。

您可以在文本节点上执行替换,如下所示:

var x = function () {
  console.log('I still work!');
    function y () {
       // ...
    }

}

var script= document.getElementsByTagName('script')[0];
script.textContent= script.textContent.replace(/function/g, 'fn');
document.querySelector('pre').textContent= script.textContent.trim();
x(); //I still work!
<pre></pre>

请注意,更改文本注释 not 必然会影响脚本的功能。