从另一个包含的JavaScript调用包含的JavaScript代码的函数

从另一个包含的JavaScript调用包含的JavaScript代码的函数,javascript,jquery,function-calls,Javascript,Jquery,Function Calls,我试图在我的页面中使用不同的加载的JavaScript,但我不能让他们说话 <html> <script type="text/javascript" src="jquery144.js"></script> <script type="text/javascript" src="shared_functions.js"></script> <script type="text/javascript" src="page_func

我试图在我的页面中使用不同的加载的
JavaScript
,但我不能让他们说话

<html>
<script type="text/javascript" src="jquery144.js"></script>
<script type="text/javascript" src="shared_functions.js"></script>
<script type="text/javascript" src="page_function_callers.js"></script>
</html>


// shared_functions.js
$(document).ready (function () {
    function sayHello (what) {
        alert (what);
    }
});

// page_function_callers.js
$(document).ready (function () {
    $("div.my_button").click (function () {
        sayHello ("Hello world!");
    });
});

//共享函数.js
$(文档).ready(函数(){
函数sayHello(什么){
警惕(什么);
}
});
//page_function_callers.js
$(文档).ready(函数(){
$(“div.my_按钮”)。单击(函数(){
说你好(“你好,世界!”);
});
});

我使用jQuery,我希望使用这种方式,因为它应该允许我重新命名许多公共方法。我错在哪里?

尝试在调用
$(文档)之外定义函数
sayHello
。ready

在上面的代码中,sayHello()方法仅在匿名函数的作用域内定义

此代码可能更适合您:

// shared_functions.js
window.MyNamespace = window.MyNamespace || {};
MyNamespace.sayHello = function(what)
{
  alert(what);    
};

// page_function_callers.js
$(document).ready (function ()
{
    $("div.my_button").click (function ()
    {
      MyNamespace.sayHello('hello world');    
    });
});
确保您正在以正确的顺序加载JS文件。还有更优雅的解决方案,但这是一个相当简单和直接的解决方案


这种方法的一个优点是不会污染全局名称空间。

函数
sayHello
DOMReady
事件(
$(document).ready
的scpoe中声明。在该范围之外,它将不可用。但不需要在该范围内声明函数。即使
sayHello
使用了很多DOM对象(在您的示例中没有),它也不会在被调用之前被执行,因此您需要确保的唯一一件事是直到DOMReady之后才调用这样的函数

因此,您只需删除shared_functions.js中的第一行和最后一行,即
$(document).ready(function(){
})
window['sayHello'] = function sayHello(what) {
  alert(what);
};
(最好给函数一个“本地”名称——“函数”关键字后面的名称,因为这样函数就不会在Firebug中显示为“匿名”)


我鼓励您研究将全局函数变成jQuery插件,或者至少是一个jQuery“全局”函数,方法是将其放在jQuery对象而不是“窗口”上。

您的代码可以工作,但有什么意义呢?为什么要将声明推迟到DOMReady,然后从该范围中提取它,而不是在DOMReady上下文之外声明它呢?您是否知道名称空间在这里是多余的;只需键入
window.sayHello=…
同样有效…修改代码以反映您的评论。如果可能的话,我仍然建议将此代码放在名称空间下。