我正在调用一个在头文件中加载自定义js文件的函数。
<head>
<script type="text/javascript" src="/js/jquery-1.5.min.js"></script>
<script type="text/javascript" src="/js/my.js"></script>
my.js有
$(document).ready(function(){
function testFunction(){
alert("inside testfunction");
}
});
点击几下后,就会加载到<body>
:
$("#someid").live($.myapp.event.play, function(event) {
alert("this works");
testFunction();
});
警报“这个有效”,开火,但没有任何反应,我做错了什么?
答案 0 :(得分:3)
这是一个范围问题。在$(document).ready
函数中定义变量(或对象,如函数)时,它们是临时的。
var x = 1; var y; $(document).ready(function() { var x= 'a billiondy'; //does not affect the global variable y=2; z=3; window.a = 4; });
此时window
有3个变量,x
,y
和a
分别等于1,2和4。
因为x
被var
重新声明,所以它不会被覆盖(它只是一个局部变量)。
由于y
中定义了window
,因此范围链会找到y并假设您的意思是window.y
。
因为z
是null
(从未声明),ready函数现在声明了一个局部变量。当ready函数关闭时,z
未在任何活动范围中引用,因此它是垃圾回收的。
同样的事情发生在a
,但它不是垃圾收集,因为你明确地说“这是一个窗口变量”。因此a
在全局范围内定义。知道了吗?
第二次编辑:
要回答Andre的问题(请参阅注释),以下代码无效:
function testFunction(){ mySecondFunction(); } //ran first $(document).ready(function(){ // ran third; window.mySecondFunction = function(){alert("this will work");} }); testFunction(); // ran second
原因是ready函数内的代码在加载其他所有内容后运行。因此,当运行testFunction(最后一行)时,未定义mySecondFunction。如果你尝试的话,这基本上就是你犯的错误:
function test() { test2() }; function test2() {alert('wtf?')};
任何不在ready函数中的代码都会在ready函数中的任何代码之前执行。但是,在文档加载之后执行的任何代码(以及就绪函数已被触发)都可以访问mySecondFunction,因为它现在已在窗口范围中定义。请考虑以下事项。
function testFunction(){ mySecondFunction(); } $(document).ready(function(){ window.mySecondFunction = function(){alert("this will work");} }); //testFunction(); erroneous do not uncomment! $(document).click(function() {testFunction();}); //works fine //$("body").click(function() {testFunction();}); //does nothing
如果单击文档,则在执行ready函数后单击,因此未注释的行正常工作。它之后没有任何内容(如果它在<head>
标记中),因为此时没有正文,所以$("body")
返回一个空的jquery列表。 javascript的年表几乎和范围一样令人困惑。
答案 1 :(得分:2)
试试这个。
function testFunction(){ alert("inside testfunction"); }
$(document).ready(function(){
testFunction();
});