0

我今天在 GitHub 上收到了一个关于一个小型 jquery 插件的拉取请求,该插件提议在它的主分支中进行一些修改,因为该插件的 Flash 元素不适用于require.js闭包。归结为 Flash 需要一个全局变量,因此通过 require.js 加载后范围会发生变化,并且不再看到该变量。

拉取请求中建议的修复是省略声明,所以基本上:

foo = { "bar": 1 };

代替:

var foo = { "bar": 1 };

但这会禁止 jslint 永远通过,所以我真的不想这样做。

我应该在我的主脚本中解决这个问题吗?

var foo = { "bar": 1 };
if ( typeof(window) === 'object' ) { window['foo'] = foo; }

还是我应该鼓励在实现中而不是在我的脚本中解决这个问题?

4

3 回答 3

1

如果您需要 Flash 的全局变量,那么我建议为您的应用程序创建一个适当的命名空间,以便 Flash 可以通过单个入口点访问它。

// create your objects for your app
var foo = {
    bar: 1
};

// add your object to the global namespace  eg. 'myApp'
window.myApp = foo;

这篇文章可能会有所帮助:http ://www.2ality.com/2011/04/modules-and-namespaces-in-javascript.html

于 2013-03-12T22:38:46.037 回答
1

第三方是否需要直接控制变量?您可以window.foo = foo在末尾添加该行。

但是,拥有一个返回值的方法会更安全getFoo(),这样您就可以控制变量。

于 2013-03-12T22:39:30.763 回答
1

您可以提供一个初始化参数,允许您的库的使用者选择将其粘贴到何处。

require(['theflashlibrary'], function(theFlashLibrary){

    theFlashLibrary.init({ globalProperty: 'foo' }); //Otherwise this could default to something else...
});

我没有这样做的好方法,但是,我觉得至少为用户提供一种方法来选择引用您的库的位置会很好。

于 2013-03-12T22:45:21.690 回答