找不到JavaScript命名空间

找不到JavaScript命名空间,javascript,Javascript,我正在尝试用JavaScript创建名称空间,如下脚本所示: var hlAdmin = hlAdmin || {}; hlAdmin.editCompany = function (src) { // function script } 然后我调用HTML中的函数: onclick="hlAdmin.editCompany(123)" 我收到一个引用错误:找不到“editCompany” 有人知道为什么吗?通常认为混合使用内联javascript和非内联javascript是不好的

我正在尝试用JavaScript创建名称空间,如下脚本所示:

var hlAdmin = hlAdmin || {};

hlAdmin.editCompany = function (src) {
   // function script
}
然后我调用HTML中的函数:

onclick="hlAdmin.editCompany(123)"
我收到一个引用错误:找不到“editCompany”


有人知道为什么吗?

通常认为混合使用内联javascript和非内联javascript是不好的。执行此操作的首选方法是使用事件处理程序将所有javascript保持在一个位置:

window.hlAdmin = window.hlAdmin || {};

window.hlAdmin.editCompany = function (src) {
   // function script
}

document.getElementById('yourElementId').onclick = function() {
    hlAdmin.editCompany(123);
};

更具体地解决这个问题:可能导致这个问题的一个原因是
hlAdmin
对象没有在全局范围内结束。您声明此声明“位于JavaScript文件的顶部”,但如果它位于任何类型的函数中(例如设置为
window.onload的函数,或jQuery
$(function(){…};
),则当声明为
var
时,它不会在全局范围内结束。使用
var
声明的变量如果在根范围内,在任何类型的函数之外,将结束全局作用域。如果您没有使用
var hlAdmin
而是使用
window.hlAdmin
,这将确保即使您在文档就绪函数或类似函数中,您也在全局上下文中创建
hlAdmin
,这将解决问题,如果它实际上是一个范围问题。

根据您的评论,我假设如下:

等效脚本(作用域如下所示):


var hlAdmin=hlAdmin | |{};
hlAdmin.editCompany=函数(src){
//此脚本中存在错误
}
说明文字
在本例中,
hlAdmin
确实在全局范围内(主机的根范围,在浏览器中称为
window

如果(在本例中)出现引用错误:
找不到“editCompany”
,则应查看(浏览器)错误日志中的其他错误消息,因为当
hlAdmin.editCompany
的函数出现致命错误时,将不会创建该函数(因此,
.editCompany
成为指向
未定义的
的属性,而不是指向函数的方法或
.editCompany
甚至不存在(取决于引擎/错误))

要调查您是否确实存在范围问题,您可以通过以下方式进行测试:
window['hlAdmin']| |(window['hlAdmin']={});
(或一些等效的变体)。如果这使代码正常工作,那么您似乎存在一些范围问题

希望这些步骤对将来的人有所帮助。

我发现了问题所在


浏览器(至少Aurora和Chrome)正在删除onclick属性中的名称空间。当您查看浏览器html时,名称空间刚刚从标记中消失。

您是否在任何函数之外创建
hlAdmin
?是的,它存在于JavaScript文件的顶部。需要更多代码来查看范围。同时,您可以尝试:
window['hlAdmin']|(window['hlAdmin']={};
以确保
hlAdmin
在全局范围内。@sphanley:由于您在hlAdmin之前使用的是var,因此在没有来自OP的任何进一步代码的情况下,不会全局创建它,这是一个伪语句。@sphanley:“它存在于JavaScript文件的顶部”通常已经表明变量在主机的根范围内(在浏览器中称为
窗口
)。您可能需要再次搜索
var
的工作方式。(另外,您当前的答案也使用var)。这只是提供了一个连接函数的替代方案,它并没有探索/解决OP问题的原因。我对它进行了更多的充实,以尽最大努力解决OP提供的小代码。谁对此投了反对票?是否愿意解释这个问题还有什么问题?我正在尽最大努力使它尽可能正确考虑到我们必须处理的信息,这是可能的。我没有投反对票,但是(正如我在对OP问题的评论中向您解释的那样),您让人们/未来的读者认为,在宿主范围内声明全局变量时,使用var声明全局变量是错误的/不正确的(实际上是OP声明他所做的),这是错误的。理解。我并不想暗示这一点,因此我将进行编辑以使我的意思更加明确。JavaScript位于单独的文件中,html页面顶部有一个脚本链接。我们确实需要查看更多代码,抱歉。甚至更好(增加您找到解决方案的机会):设置一个简单的JSFIDLE,复制您的问题并将其添加到您的问题中,包括给出此结果/错误的浏览器。如果重构您的问题的过程导致了解决方案,请同时报告解决方案。我突然想到(因为我们目前正在寻找幽灵):外部javascriptfile实际加载了吗?啊哈!所以我建议不要使用内联onclick比我所知道的更切题。这将是我很久以来听到的最奇怪的错误之一,因为这会破坏其他脚本/网站的主干负载。你还可以说(在另一条评论中)“它在JSFIDLE中工作”。。。(因此,如果是浏览器的问题,小提琴也不起作用)。(我希望so的一位顶级专家对此进行确认。)另外,如果你像这个问题中那样注入html,你可能会告诉我们。唉,没有你的源代码,我们不知道到底出了什么问题。FWIW:刚刚由javascript聊天中的专家运行了这个。他们声称Chrome没有做这样的事情(重写你的内联事件处理程序)根据您的描述,这个问题无法重现。它一定是代码中的其他内容,所以不要从中“吸取”错误的教训!
<html><head>

</script>
var hlAdmin = hlAdmin || {};

hlAdmin.editCompany = function (src) {
   // error in this script
}
</script>

</head></body>
  <button onclick="hlAdmin.editCompany(123)">Caption</button>
</body></html>