未定义函数 - 未捕获的 ReferenceError

Posted

技术标签:

【中文标题】未定义函数 - 未捕获的 ReferenceError【英文标题】:Function is not defined - Uncaught ReferenceError 【发布时间】:2022-01-24 07:35:04 【问题描述】:

我有这个“未捕获的 ReferenceError: function is not defined”错误,不明白。

如果我有

$(document).ready(function() 
  function codeAddress() 
    var address = document.getElementById("formatedAddress").value;
    geocoder.geocode(
      'address': address
    , function(results, status) 
      if (status == google.maps.GeocoderStatus.OK) 
        map.setCenter(results[0].geometry.location);
      
    );
  
);

<input type="image" src="btn.png"  onclick="codeAddress()" />
<input type="text" name="formatedAddress" id="formatedAddress" value="" />

当我按下按钮时,它会返回“Uncaught ReferenceError”。

但是,如果我将codeAddress() 放在 $(document).ready(function()) 之外,那么它会工作很好

我的意图是将codeAddress() 放在document.ready 函数中。

【问题讨论】:

有问题的网站上的按钮丢失了,哪个有附加的错误? 左边的按钮,有“位置或地址” 【参考方案1】:

有时会因为缓存和cookies以及我们在js文件上创建的函数无法被浏览器加载而发生。因此,请尝试清除缓存和 cookie 或在同一页面上按 CTRL+F5。另外,您可以尝试在隐身模式下打开它。

【讨论】:

【参考方案2】:

清除缓存为我解决了这个问题,或者您可以在其他浏览器中打开它

index.js

function myFun() 
    $('h2').html("H999999");

index.jsp

<html>
<head>
    <title>Reader</title>
</head>
<body>
<h2>$message</h2>
<button id="hi" onclick="myFun();" type="submit">Hi</button>
</body>
</html>

【讨论】:

【参考方案3】:

我想我会提到这一点,因为我花了一段时间来解决这个问题,而且我在 SO 上的任何地方都找不到答案。我正在编写的代码为一位同事工作,但不适合我(我遇到了同样的错误)。它适用于 Chrome,但不适用于 Edge。

我可以通过清除 Edge 中的缓存来使其正常工作。

这可能不是这个特定问题的答案,但我想我会提到它以防它为其他人节省一点时间。

【讨论】:

【参考方案4】:

还有一件事。根据我的经验,发生此错误是因为 Function is not defined - uncaught referenceerror 之前还有另一个错误。

因此,通过控制台查看是否存在先前的错误,如果存在,请更正任何存在的错误。你可能很幸运,因为他们是问题所在。

【讨论】:

【参考方案5】:

请检查您是否提供了正确的 js 引用。首先是 JQuery 文件,然后是您的自定义文件。由于您在 js 方法中使用了“$”。

【讨论】:

【参考方案6】:

你必须在ready()之外写那个函数体;

因为ready是用来调用函数或者绑定绑定id的函数,像这样。

$(document).ready(function() 
    $("Some id/class name").click(function()
        alert("i'm in");
    );
);

但如果你在 onchange/onclick 事件中调用“showAmount”函数,则不能这样做

$(document).ready(function() 
    function showAmount(value)
        alert(value);
    

);

你必须在ready()之外写“showAmount”;

function showAmount(value)
    alert(value);//will be called on event it is bind with

$(document).ready(function() 
    alert("will display on page load")
);

【讨论】:

【参考方案7】:

您的问题是您不了解您设置的范围。

您正在向ready 函数传递一个函数本身。在此函数中,您将创建另一个名为 codeAddress 的函数。这个存在于创建它的范围内,而不是在 window 对象内(所有东西及其叔叔都可以调用它)。

例如:

var myfunction = function()
    var myVar = 12345;
;

console.log(myVar); // 'undefined' - since it is within 
                    // the scope of the function only.

在这里查看更多关于匿名函数的信息:http://www.adequatelygood.com/2010/3/javascript-Module-Pattern-In-Depth

另一件事是我注意到您在该页面上使用了 jQuery。这使得设置点击处理程序变得更加容易,您无需费心在 HTML 中设置“onclick”属性。您也不需要将codeAddress 方法提供给所有人:

$(function()
    $("#imgid").click(function()
        var address = $("#formatedAddress").value;
        geocoder.geocode(  'address': address, function(results, status) 
           if (status == google.maps.GeocoderStatus.OK) 
             map.setCenter(results[0].geometry.location);
           
        );
    );  
);

(您应该删除现有的onclick 并向您要处理的图像元素添加一个ID)

请注意,我已将 $(document).ready() 替换为它的快捷方式 $() (http://api.jquery.com/ready/)。然后使用click 方法为元素分配一个点击处理程序。我还用 jQuery 对象替换了您的 document.getElementById

【讨论】:

哇!谢谢乔纳森,你对像我这样的初学者的所有解释都非常有帮助。 这对我不起作用..我仍然有同样的问题,你能帮帮我吗【参考方案8】:

如何去掉onclick属性并添加一个ID:

<input type="image" src="btn.png"  id="img-clck" />

还有你的脚本:

$(document).ready(function()
    function codeAddress() 
        var address = document.getElementById("formatedAddress").value;
        geocoder.geocode(  'address': address, function(results, status) 
            if (status == google.maps.GeocoderStatus.OK) 
                map.setCenter(results[0].geometry.location);
            
        );
    
    $("#img-clck").click(codeAddress);
);

这种方式如果你需要改变函数名或者什么都不需要接触html。

【讨论】:

@ifaour 如果我想将参数传递给codeAddress() 函数,该怎么办? 删除onclick 不会一直有帮助。我正在动态创建一些元素,并希望它们在单击时调用一个函数。我不能用你提到的方法来实现这一点。你的是替代方案,不是问题的解决方案。 如果所有其他方法都没有在就绪部分中受到保护,这将很有帮助。由于嵌套视图,这变得有点头疼,我们必须使用准备好的文档,但可以在外部声明的内部访问。【参考方案9】:

问题是codeAddress() 没有足够的范围可以从按钮调用。你必须在ready()的回调之外声明它:

function codeAddress() 
    var address = document.getElementById("formatedAddress").value;
    geocoder.geocode(  'address': address, function(results, status) 
        if (status == google.maps.GeocoderStatus.OK) 
            map.setCenter(results[0].geometry.location);
        
    );



$(document).ready(function()
    // Do stuff here, including _calling_ codeAddress(), but not _defining_ it!
);

【讨论】:

感谢 Humberto,我现在对 javascript 有了更多的了解。谢谢你的解释。 这个!这是我的问题的答案,因为我无法运行自己的函数(与 jQuery 无关),并且只要我将它们放在 jQuery(document).ready(function() 之前,一切正常!谢谢,温贝托! 谢谢,这个回答让我了解jquery和js 完美答案。解决了我的问题,function was undefined

以上是关于未定义函数 - 未捕获的 ReferenceError的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的类型错误未定义不是函数

自定义模块:未捕获类型错误:未定义不是函数

未捕获的 ReferenceError:未使用 onclick 定义函数

未捕获的错误:调用未定义的函数 have_post()

流星:ReferenceError:IRC未定义

未捕获的错误:调用未定义的函数 mysql_escape_string()