问题标题基本上说明了一切。我制作了this小提琴让它很容易测试。下面的代码:当在JavaScript中执行传入的回调函数时,是否可以确定是否可以调用某个函数?
var test = function(callback) {
console.log("callback() might call alert()");
callback();
}
test(function() {
alert("one");
});
问题标题基本上说明了一切。我制作了this小提琴让它很容易测试。下面的代码:当在JavaScript中执行传入的回调函数时,是否可以确定是否可以调用某个函数?
var test = function(callback) {
console.log("callback() might call alert()");
callback();
}
test(function() {
alert("one");
});
转换函数的字符串返回的源代码,你可以搜索使用正则表达式。
var test = function(callback) {
if (callback.toString().test(/\balert\s*\(/) {
console.log("callback might call alert()");
callback();
};
虽然这并不完美。它将不起作用:
var foo = alert;
test(function() {
foo("Fooled you!");
});
如果alert(
出现在字符串中,它也可能得到误报。
非常酷。我没有意识到可以在函数上使用'toString()'来返回源代码。 – 2014-10-17 05:59:01
我也没有。我搜索了_javascript函数的源代码,它指向了'.toString()'的MDN条目。它也发现'.toSource',但那不是标准的。你来这里之前是什么谷歌的? – Barmar 2014-10-17 06:04:23
你可以重新定义功能警报
function alert(str) {
console.log('Somebody call alert:'+str);
}
但恕我直言,不能肯定的呼叫前检查。
这在一般情况下是不可行的。如果'alert()'在'if'内部怎么办?调用者无法知道该条件是真是假,因此无法分辨是否会被调用。这相当于[暂停问题](http://en.wikipedia.org/wiki/Halting_problem) – Barmar 2014-10-17 05:38:34
@Barmar:你是对的......但保持尽可能简单,有什么方法可以偷看回调函数里面传入了什么?甚至只是看看'alert()'被引用了多少次(即使它永远不会被调用)? – 2014-10-17 05:41:13
@Barmar:我已经对你的评论做了一些回应。 – 2014-10-17 05:46:46