原代码:
'use strict';
function GitJs(config) {
var defaults = {
inheriting: false,
clientId: undefined,
accessToken: undefined,
baseUrl: 'https://api.github.com',
mode: 'read'
};
this.config = $.extend(defaults, config);
}
/**
* Gets the jQuery method that GitJs#generateApiRequest is going to use to send the ajax request.
*
* @param {string} httpVerb The HTTP verb that the request will use,
* @return string
*/
GitJs.prototype.getCommandMethod = function (httpVerb) {
var method = $.get;
switch (httpVerb) {
case 'GET':
method = $.get;
break;
case 'POST':
method = $.post;
break;
}
return method;
};
...
新代码:
(function() {
'use strict';
'use strict';
function GitJs(config) {
var defaults = {
inheriting: false,
clientId: undefined,
accessToken: undefined,
baseUrl: 'https://api.github.com',
mode: 'read'
};
this.config = $.extend(defaults, config);
}
/**
* Gets the jQuery method that GitJs#generateApiRequest is going to use to send the ajax request.
*
* @param {string} httpVerb The HTTP verb that the request will use,
* @return string
*/
GitJs.prototype.getCommandMethod = function (httpVerb) {
var method = $.get;
switch (httpVerb) {
case 'GET':
method = $.get;
break;
case 'POST':
method = $.post;
break;
}
return method;
};
...
}());
就此代码而言,当我尝试时:
var gitjs = new GitJs();
我被告知 GitJs 未定义
我到底在想什么:
- 我不想在每个方法中都使用
use strict
。 - 如果我的代码被缩小并连接到另一个文件,我希望它能很好地发挥作用。
- 我想使用
.prototype
语法以便于以后继承(以及代码清晰度) - 我不想制作全局
var gitJs
变量,因为它可能会被其他人的脚本覆盖。 - 我假设用户将始终通过
new
关键字调用对象构造函数
郑重声明,我知道我错了。大错特错。我似乎无法弄清楚我思维中的缺陷在哪里,我希望得到一些指导。
最佳答案
你的问题是 GitJS 现在是立即调用函数的私有(private)变量。您不能将您的功能隐藏在私有(private)范围内,同时使其公开可用。它们是相互排斥的目标。
因此,您需要通过窗口显式设置全局变量
var GitJS;
(function() {
'use strict';
GitJS = function(){ ... }
...
}());
或者从 IIFE 内部返回导出的函数。
var ExportedGitJS = (function(){ //using a different name just to be clear...
'use strict';
var GitJS = function(){ ... }
...
return GitJS;
}());
好吧,我撒谎了。您可以创建 Javascript 模块而不必依赖全局变量,但这通常也意味着使用不同的模块创建约定和/或使用模块库。我强烈建议您查看 http://requirejs.org/如果您对此感兴趣。
关于javascript - IIFE(立即调用的函数表达式)中的 Object.Prototype 方法和 'Use Strict',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11255461/