2014-10-17 41 views
0

问题标题基本上说明了一切。我制作了this小提琴让它很容易测试。下面的代码:当在JavaScript中执行传入的回调函数时,是否可以确定是否可以调用某个函数?

var test = function(callback) { 
    console.log("callback() might call alert()"); 
    callback(); 
} 

test(function() { 
    alert("one"); 
}); 
+1

这在一般情况下是不可行的。如果'alert()'在'if'内部怎么办?调用者无法知道该条件是真是假,因此无法分辨是否会被调用。这相当于[暂停问题](http://en.wikipedia.org/wiki/Halting_problem) – Barmar 2014-10-17 05:38:34

+0

@Barmar:你是对的......但保持尽可能简单,有什么方法可以偷看回调函数里面传入了什么?甚至只是看看'alert()'被引用了多少次(即使它永远不会被调用)? – 2014-10-17 05:41:13

+0

@Barmar:我已经对你的评论做了一些回应。 – 2014-10-17 05:46:46

回答

1

转换函数的字符串返回的源代码,你可以搜索使用正则表达式。

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(出现在字符串中,它也可能得到误报。

+0

非常酷。我没有意识到可以在函数上使用'toString()'来返回源代码。 – 2014-10-17 05:59:01

+0

我也没有。我搜索了_javascript函数的源代码,它指向了'.toString()'的MDN条目。它也发现'.toSource',但那不是标准的。你来这里之前是什么谷歌的? – Barmar 2014-10-17 06:04:23

0

你可以重新定义功能警报

function alert(str) { 
 
    console.log('Somebody call alert:'+str); 
 
}

但恕我直言,不能肯定的呼叫前检查。

相关问题