[英]jquery ' Uncaught ReferenceError not defined' error message in chrome console
[英]Why getting “Uncaught ReferenceError: $ is not defined” error on Chrome Dev Console?
我正在尝试在Chrome开发者控制台中运行一个简单的JQuery脚本,但是出现问题。
当我在Chrome开发者控制台上运行此代码时,此代码没有问题:
var someValue = $("[name='Jack']");
if(someValue !== null){
console.log("Jack is here!");
}
但是,尝试在setTimeout
函数中运行相同的代码时出现错误,如下所示:
setTimeout(function(){
var someValue = $("[name='Jack']");
if(someValue !== null){
console.log("Jack is here!");
}
}, 1000);
未捕获的ReferenceError:未定义$
这不仅在setTimeout函数中发生,在正常函数中也发生。
我正在使用最新版本的Google Chrome。 如何在setTimeout
函数中使用上述JQuery?
这里的混乱集中在$
是Chrome命令行API的一部分这一事实上。 在代码中使用$
时,是指名为$
的命令行API函数。 您可能根本没有加载jQuery:的确,您的someValue !== null
代码无论如何都无法与jQuery一起使用。 您需要测试一个非空的jQuery对象( someValue.length > 0
),而不是一个非null
。
至于为什么可以在控制台中访问Chrome的$
而不是setTimeout
回调的原因:这似乎是特定于引擎的魔术,将命令行API限制为仅控制台代码。 setTimeout
以这样一种方式执行其回调,即Chrome无法确定代码是否源自控制台,因此它不会授予对名为$
的命令行API函数的访问权限。 奇怪的是,这不是JavaScript的典型特征。 使用正常的JavaScript作用域规则,无论执行的时间和位置如何, setTimeout
回调都应可以访问与周围代码相同的变量。 一秒钟后范围就不同了,这一事实令人惊讶-您感到困惑是正确的!
出于好奇,在香草JavaScript中对此进行模拟的方法是使用基于对象的作用域, with
在命令完成后进行更改。 例如,如果您在控制台中键入的每个代码段都包含以下内容:
var chromeConsoleAPI = { $: function() { ... } }
with(chromeConsoleAPI) {
// your snippet here
}
delete chromeConsoleAPI.$;
在这种情况下,通过访问作用域链上的chromeConsoleAPI
对象来提供$
。 普通代码可以访问$
,但是由于setTimeout
函数在删除chromeConsoleAPI.$
之后运行,因此找不到名为$
任何内容。 注意,这仍然不能完全复制行为,因为这会阻止对任何用户定义的$
访问。 实际上,命令行API必须将其功能注入作用域链的最顶部(即,最远程)。
该问题是因为在加载您的自定义代码之后,将加载Jquery库。
您是否使用外部js文件作为自定义脚本? 然后,将脚本加载到jquery脚本下。
您必须先添加jquery库链接,然后添加脚本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.