我在HTML页面上引用JavaScript如下:
<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.js"></script>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&region=GB"></script>
<script type="text/javascript" src="js/shared.js"></script>
<script type="text/javascript">
$('document').ready(function() {
// In-page code: call some functions in shared.js
});
</script>
shared.js中定义的函数未包含在$('document').ready
中。所以:
是否可以安全地假设shared.js
中定义的功能可用于“页内代码”?
如果我将页内代码拉出到一个名为local.js
的单独文件中(保持在$('document').ready
中),是否仍然可以安全地假设{{1}中定义的函数有空吗?
最后,我是不是将shared.js
内的shared.js包装成问题?我发现如果我将它包装起来,它的功能将不再适用于页内代码。
问题3的原因是我遇到了这个问题:Uncaught TypeError: Property ... is not a function - after page has loaded
并想知道这是否与我如何组织代码有关。
更新:感谢您的回答。现在很清楚,在shared.js中使用$('document').ready
会从全局范围中删除这些函数。但是,我只想澄清第3点中的原始问题。
如果我执行以下操作,我可以假设:
$('document').ready
内加载,从shared.js调用函数没有问题吗?
换句话说,即使我没有将$('document').ready
内的所有内容都包含在shared.js
内的文件中,是否可以安全地假设页面将在调用$('document').ready
内的函数时加载?
答案 0 :(得分:25)
可以安全地假设shared.js中定义的函数可用于“页内代码”吗?
是的,只要这些功能被注入全球范围
如果我将页内代码拉出到一个名为local.js的单独文件中(将其保存在$('document')。ready中),是否可以安全地假设shared.js中定义的函数可用?
是的,只要在local.js
AND 之后包含shared.js
,shared.js就会将函数注入全局范围。
最后,事实是我没有在$('document')中包装shared.js。准备好了吗?我发现如果我把它包装起来,它的功能就不再适用于页内代码了。
在document.ready
中包装函数会使它们超出全局范围。
var foo = 4; // global
$(function() {
var bar = 5; // local
});
foo = bar; // error
您需要在全局范围内注入变量,这就像执行
一样简单$(function() {
/* all your code */
window["SomeGlobalVariable"] = someFunctionIWantGlobal;
});
答案 1 :(得分:3)
function foo(){}
window.foo = function(){};
。然而,这一切都无关紧要,因为您需要一个dom ready侦听器或者您不需要 - 取决于您是否尝试访问该代码中的dom。如果是,则将其包装,如果没有,则不要。如上所述,无论哪种方式,您都可以关闭代码,以免污染全局命名空间,或者如果您愿意,可以污染它。
答案 2 :(得分:1)
可以安全地假设(如果定义未隐藏在无法访问的闭包内)。
//shared.js
function DoThis() {}
function DoThat() {}
它仍然有效,只需在local.js
shared.js
<script type="text/javascript" src="js/shared.js"></script>
<script type="text/javascript" src="js/local.js"></script>
它不起作用,因为函数被包装在一个闭包中(将在domready上运行的那个),所以它们只能在闭包中使用
$(document).ready(function () { //this is a closure!
function DoSg() {}
//DoSg is only available inside the closure
//cannot be accessed from the outside, it's defined inside
});
此外,没有必要将函数定义放入$(document).ready()
。重要的部分是当你调用这些函数时,应该在.ready()
内(如果它涉及DOM内容或者在页面加载后应该完成的任何事情)。
答案 3 :(得分:0)
最后,事实是我不是 将shared.js包装在里面 $('文件')。准备好了吗?我 发现如果我把它包起来的话 函数不再可用 页内代码。
如果将函数包装在document.ready中,那么这些函数在全局范围内不可用,因为函数具有局部范围(包含它们的函数内的I.E)
答案 4 :(得分:0)
您提供的代码组织很好。 “shared.js”中定义的所有功能都可用于您网页的其余部分,包括$('document').ready(function()
阻止。
但是,如果将函数放在该块中的shared.js 中,则将代码的范围限制为$('document').ready(function()
(即页面中没有其他内容可以使用它) - - 如果你想让“shared.js”中的东西可用于代码/应用程序的其他部分,那么这就不是你想要的了。