jquery中的变量在没有var定义时给出Uncaught ReferenceError

时间:2016-11-21 07:01:54

标签: javascript jquery

我的javascript文件中的一段代码

$(document).ready(function(){
    gsdk.init();
});

// Note: No var in the prefix of gsdk and it is also declared only here
gsdk = {
    init : some function...
}

当我在html页面中添加此javascript文件并运行时,它会给出

Uncaught ReferenceError: gsdk is not defined(…)

2 个答案:

答案 0 :(得分:4)

该代码依赖于The Horror of Implicit Globals¹,其中分配未声明的标识符会创建一个全局变量。

要获得您所描述的错误,ready“事件”必须在代码运行之前已经已经被触发,因为jQuery的ready功能是混乱的:如果页面已经准备好,它会同步调用它的回调;如果没有,它会异步调用它。

如果它异步调用回调,则不会出现错误,因为分配给gsdk的代码将在回调中的代码之前运行,从而创建全局并赋予其价值。

无论如何,修复方法是:

  1. 声明gsdk,不要依赖隐式全局变量的恐怖,

  2. 的初始化移到上面{/ 1}}代码,这样如果同步调用ready回调,ready就会初始化并准备就绪使用。

  3. E.g:

    gsdk

    ¹(这是我贫血的小博客上的帖子。)

答案 1 :(得分:1)

你有语法错误。它应该工作

虽然gsdk在这里是一个全局变量。虽然不能用var声明它不应该是一个问题,但它会在全局对象上创建一个变量,即window.gsdk / gsdk在这里是相同的,甚至你在调用后声明它是gsdk它不会抛出错误,因为变量被挂起 您的代码与以下内容类似

var gsdk;
$(document).ready(function(){
    gsdk.init();
});

gsdk = {
    init : function(){
       alert("hi");
     }
}

$(document).ready(function(){
    gsdk.init();
});

gsdk = {
    init : function(){
       alert("hi");
     }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>