我的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(…)

最佳答案

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

为了得到您所描述的错误,在运行代码之前,必须先触发ready“事件”,因为jQuery的ready功能比较混乱:如果页面已经准备就绪,它将同步调用其回调;如果不是,它将异步调用它。

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

无论如何,解决方法是:


声明gsdk,不要依赖隐式全局变量的恐怖,并且
将其初始化移到您的ready代码上方,以便如果同步调用ready回调,则gsdk将被初始化并可以使用。


例如。:

// 1. Declare the variable, don't rely on The Horror of Implicit Globals.
// 2. Make certain it has its value before setting up your `ready` callback, since
//    apparently you're doing this when the page is already ready.
var gsdk = {
    init : some function...
};

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




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

10-06 15:12