Я знаю, что это старая версия, но я разработал лучшее решение, потому что все вышеперечисленное не работает для сценариев Async. С некоторыми изменениями следующий скрипт может охватывать практически все варианты использования. Вот что сработало для меня:
function getScriptName() {
var error = new Error()
, source
, lastStackFrameRegex = new RegExp(/.+\/(.*?):\d+(:\d+)*$/)
, currentStackFrameRegex = new RegExp(/getScriptName \(.+\/(.*):\d+:\d+\)/);
if((source = lastStackFrameRegex.exec(error.stack.trim())) && source[1] != "")
return source[1];
else if((source = currentStackFrameRegex.exec(error.stack.trim())))
return source[1];
else if(error.fileName != undefined)
return error.fileName;
}
Не уверен насчет поддержки в Internet Explorer, но отлично работает во всех других браузерах, на которых я тестировал.