如何在 运行 时从自身获取 javascript 书签的来源?

How to get the source of a javascript bookmark from itself when running?

我有一个 JavaScript 书签。例如:

javascript:alert('hi');

我希望能够从书签本身中获取当前 运行 JavaScript 书签的来源,所以在伪代码中:

javascript:alert(currentlyExecutingScript.text);

哪个会提醒

javascript:alert(currentlyExecutingScript.text);

我该怎么做?我更喜欢跨浏览器解决方案,但仅 Chrome 个特定解决方案就完全没问题!

我为什么对这个感兴趣?因为我正在写一个引用自身的小书签。

由于 location 指的是当前页面的 URL,并且 JavaScript 书签不会更改 location,这在当前的任何浏览器中都是不可能的。

但是,可以在JavaScript中做您想做的事:

javascript:void function f(){alert(f.toString())}()

这将 alert 以下内容:

function f(){alert(f.toString())}

toString() 方法,当在函数上调用时,returns 表示函数源代码的字符串(参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString)。

信用

@SergeSeredenko建议使用void.

When using an immediately-invoked function expression, void can be used to force the function keyword to be treated as an expression instead of a declaration.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void#Immediately_Invoked_Function_Expressions

你可以把你的脚本写成一个字符串,然后一个邪恶的 eval 来执行它,脚本有一个对它自己的引用:

javascript:var script = "alert('hi'); alert(script)";
eval(script);

会提示"hi",然后是script的内容。

实现此目的的最简单但肯定不是最安全的方法是将代码存储在字符串中,并在您单击书签时评估该字符串。

var code = "alert('Hi');var num = 988;alert(num + 12)";
//code contains the code you wish to run
eval(code);
//runs the code.
alert(code); 
//alerts the code.

我会非常小心地使用 eval() 函数。

有关详细信息,请参阅 this SO question