我想优化项目但面临问题。我不知道如何解决这个问题。我想使用立即调用functoins来初始化IS_LOCALHOST属性和CONTEXT_PATH,但我无法访问isLocalhost()函数和常量属性(如端口号)。我尝试将this
作为参数立即调用函数,但它引用了文档,我也尝试保存像self: this
这样的refence并使用像{peremeter甚至this.self
这样的util
。我不明白如何解决这个问题。请帮助我理解工作解决方案。
var util = {
WAR_FILE_NAME : 'app-name/',
DEFAULT_TOMCAT_PORT : 8080,
DEFAULT_SECURE_TOMCAT_PORT : 8443,
/*** Pre construct block ***/
IS_LOCALHOST : ( function () {
var isLocalhost = false, hostWithPort = location.host;
if ( hostWithPort.indexOf('localhost') !== -1 || hostWithPort.indexOf('127.0.0.1') !== -1 ) {
isLocalhost = true;
}
return isLocalhost;
}() ),
isLocalhost : function (){
return this.IS_LOCALHOST;
},
CONTEXT_PATH : ( function (utilModule) {
return location.hostname + ( location.port ? ':' + utilModule.DEFAULT_TOMCAT_PORT : '' ) + '/' + ( utilModule.isLocalhost() ? utilModule.WAR_FILE_NAME : '' );
}(util) ),
SECURE_CONTEXT_PATH : ( function (utilModule) {
return location.hostname + ( location.port ? ':' + utilModule.DEFAULT_SECURE_TOMCAT_PORT : '' ) + '/' + ( utilModule.isLocalhost() ? utilModule.WAR_FILE_NAME : '' );
}(util) )
}
答案 0 :(得分:1)
我不确定为什么你需要将它们设为IIFEs。
为什么不像下面第一个例子那样使它们成为正常函数,或者只是在第二个例子中的适当时间设置属性?
var util = {
WAR_FILE_NAME: 'app-name/',
DEFAULT_TOMCAT_PORT: 8080,
DEFAULT_SECURE_TOMCAT_PORT: 8443,
/*** Pre construct block ***/
IS_LOCALHOST: (function() {
var isLocalhost = false,
hostWithPort = location.host;
if (hostWithPort.indexOf('localhost') !== -1 || hostWithPort.indexOf('127.0.0.1') !== -1) {
isLocalhost = true;
}
return isLocalhost;
}()),
isLocalhost: function() {
return util.IS_LOCALHOST;
},
CONTEXT_PATH: function() {
return location.hostname + (location.port ? ':' + util.DEFAULT_TOMCAT_PORT : '') + '/' + (util.isLocalhost() ? util.WAR_FILE_NAME : '');
},
SECURE_CONTEXT_PATH: function() {
return location.hostname + (location.port ? ':' + util.DEFAULT_SECURE_TOMCAT_PORT : '') + '/' + (util.isLocalhost() ? util.WAR_FILE_NAME : '');
}
};
var util = {
WAR_FILE_NAME: 'app-name/',
DEFAULT_TOMCAT_PORT: 8080,
DEFAULT_SECURE_TOMCAT_PORT: 8443,
/*** Pre construct block ***/
IS_LOCALHOST: (function() {
var isLocalhost = false,
hostWithPort = location.host;
if (hostWithPort.indexOf('localhost') !== -1 || hostWithPort.indexOf('127.0.0.1') !== -1) {
isLocalhost = true;
}
return isLocalhost;
}()),
isLocalhost: function() {
return util.IS_LOCALHOST;
}
};
util.CONTEXT_PATH = (function() {
return location.hostname + (location.port ? ':' + util.DEFAULT_TOMCAT_PORT : '') + '/' + (util.isLocalhost() ? util.WAR_FILE_NAME : '');
})();
util.SECURE_CONTEXT_PATH = (function() {
return location.hostname + (location.port ? ':' + util.DEFAULT_SECURE_TOMCAT_PORT : '') + '/' + (util.isLocalhost() ? util.WAR_FILE_NAME : '');
})();
答案 1 :(得分:1)
不要像这样创建你的对象:
var util = {
foo: bar,
blah: stuff
等。这是冗长而繁琐的。相反,将其包装在IIFE中并将所有初始化逻辑放在此函数中:
var util = (function() {
var t = {};
t.foo = bar;
t.blah = stuff;
return t;
})();
例如:
var util = (function() {
var t = {};
t.WAR_FILE_NAME = 'app-name/';
t.DEFAULT_TOMCAT_PORT = 8080;
t.DEFAULT_SECURE_TOMCAT_PORT = 8443;
t.IS_LOCALHOST = false;
var hostWithPort = location.host;
if ( hostWithPort.indexOf('localhost') !== -1 || hostWithPort.indexOf('127.0.0.1') !== -1 ) {
t.IS_LOCALHOST = true;
}
t.CONTEXT_PATH = location.hostname
+ (location.port ? '=' + t.DEFAULT_TOMCAT_PORT : '')
+ '/'
+ ( t.IS_LOCALHOST ? t.WAR_FILE_NAME : '' );
t.SECURE_CONTEXT_PATH = location.hostname
+ (location.port ? '=' + t.DEFAULT_SECURE_TOMCAT_PORT : '' )
+ '/'
+ ( t.IS_LOCALHOST ? t.WAR_FILE_NAME : '');
return t;
})();