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

时间:2010-02-13 16:25:38

标签: 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_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!");
    });
});

我使用jQuery并且我想使用这种方式,因为它应该让我回忆许多公共方法。哪里我错了?

4 个答案:

答案 0 :(得分:3)

函数sayHelloDOMReady事件($(document).ready)的scpoe内声明。它不会在该范围之外。但是没有需要来声明该范围内的函数。即使sayHello使用了很多DOM对象(在你的例子中它没有),它在被调用之前不会被执行,所以你唯一需要确保的是这样的函数不是在DOMReady之后调用

所以你可以简单地删除shared_functions.js中的第一行和最后一行,分别是$(document).ready(function() {});,你的代码就可以了。

答案 1 :(得分:2)

尝试在通话sayHello之外定义功能$(document).ready

答案 2 :(得分:2)

当你在“准备好”的功能中声明“sayHello”(有人记得夏洛特教会的歌曲吗?Gosh,记忆......)时,它就是那个功能的本地。如果您愿意,可以将其设为全局:

window['sayHello'] = function sayHello(what) {
  alert(what);
};

(很高兴为函数提供一个“本地”名称 - “function”关键字后面的名称 - 因为这个函数在Firebug中不会显示为“匿名”。)

我鼓励你研究把你的全局函数变成一个jQuery插件,或者至少把jQuery“global”放在jQuery对象而不是“window”上。

答案 3 :(得分:0)

在上面的代码中,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文件。有更优雅的解决方案,但这是一个相当简单和直接的解决方案。

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