Javascript 初始化内部嵌套函数
我有以下javascript函数:Javascript 初始化内部嵌套函数,javascript,Javascript,我有以下javascript函数: var headerFunctionality=函数(){ var已初始化=错误; //其他变量 函数init(){ 如果(!此.已初始化){ //在这里做事 this.isInitialized=true; } }; 函数销毁(){ 如果(本文件已初始化){ //在这里做事 this.isInitialized=false; } }; } 我如何更改此设置,以便可以拨打电话 headerFunctionality.init(); headerFunctio
var headerFunctionality=函数(){
var已初始化=错误;
//其他变量
函数init(){
如果(!此.已初始化){
//在这里做事
this.isInitialized=true;
}
};
函数销毁(){
如果(本文件已初始化){
//在这里做事
this.isInitialized=false;
}
};
}
我如何更改此设置,以便可以拨打电话
headerFunctionality.init();
headerFunctionality.destroy();
我尝试添加一个返回,如下所示:
return {
init: init,
destroy: destroy
}
var hf = new HeaderFunctionality();
hf.init();
console.log(hf.isInitialized); // => true
hf.destroy();
console.log(hf.isInitialized); // => false
但这只允许我调用headerFunctionality()
,然后似乎触发了两个内部函数
我所看到的一切都告诉我,我需要这样做:
function headerFunctionality() {
...same inner as above
}
var header = headerFunctionality();
header.init();
var HeaderFunctionality = function () {
this.isInitialised = false;
//other variables (with this)
}
HeaderFunctionality.prototype.init = function() {
if (!this.isInitialised) {
//do stuff here
this.isInitialised = true;
}
};
HeaderFunctionality.prototype.destroy = function() {
if (this.isInitialised) {
//do stuff here
this.isInitialised = false;
}
};
这是唯一的方法,还是我能够改变上述内容,使函数本身成为变量?实现这一点的最好、也是最常见的方法之一是使用。将
函数
包装在一个容器中
实现这一目标的最佳、也是最常见的方法之一是使用。将
函数
包装在一个容器中
您可以立即执行该功能:
var headerFunctionality = (function () {
var isInitialised = false; // I'm leaving it in, but it's not used anywhere! You change this.isInitiaized later which isn't the variable declared here.
//other variables
function init() {
if (!this.isInitialised) {
//do stuff here
this.isInitialised = true;
}
};
function destroy() {
if (this.isInitialised) {
//do stuff here
this.isInitialised = false;
}
};
return {
init: init,
destroy: destroy
}
}());
您还可以更改本地isInitialized
变量,而不是此变量。isInitialized
:
var headerFunctionality = (function () {
var isInitialised = false;
//other variables
function init() {
if (!isInitialised) {
//do stuff here
console.log( 'initialized' );
isInitialised = true;
}
};
function destroy() {
if (isInitialised) {
//do stuff here
console.log( 'destroyed' );
isInitialised = false;
}
};
return {
init: init,
destroy: destroy
}
}());
第二个示例与第一个示例之间的区别在于,在第一个示例中(使用
this
)显示isInitialized
属性,因此您可以从外部检查标题功能。isInitialized
。在第二个示例中,闭包中保存的局部变量被修改,无法从外部作用域访问。您可以立即执行该函数:
var headerFunctionality = (function () {
var isInitialised = false; // I'm leaving it in, but it's not used anywhere! You change this.isInitiaized later which isn't the variable declared here.
//other variables
function init() {
if (!this.isInitialised) {
//do stuff here
this.isInitialised = true;
}
};
function destroy() {
if (this.isInitialised) {
//do stuff here
this.isInitialised = false;
}
};
return {
init: init,
destroy: destroy
}
}());
您还可以更改本地isInitialized
变量,而不是此变量。isInitialized
:
var headerFunctionality = (function () {
var isInitialised = false;
//other variables
function init() {
if (!isInitialised) {
//do stuff here
console.log( 'initialized' );
isInitialised = true;
}
};
function destroy() {
if (isInitialised) {
//do stuff here
console.log( 'destroyed' );
isInitialised = false;
}
};
return {
init: init,
destroy: destroy
}
}());
第二个示例和第一个示例之间的区别在于,在第一个示例中(使用
this
)显示isInitialized
属性,因此您可以从外部检查标题功能。isInitialized
。在第二个示例中,闭包中保存的局部变量被修改,无法从外部作用域访问。如果您尝试执行“类”操作,您可以通过以下操作实现您的目标:
function headerFunctionality() {
...same inner as above
}
var header = headerFunctionality();
header.init();
var HeaderFunctionality = function () {
this.isInitialised = false;
//other variables (with this)
}
HeaderFunctionality.prototype.init = function() {
if (!this.isInitialised) {
//do stuff here
this.isInitialised = true;
}
};
HeaderFunctionality.prototype.destroy = function() {
if (this.isInitialised) {
//do stuff here
this.isInitialised = false;
}
};
然后,您可以创建并使用标题功能对象,如下所示:
return {
init: init,
destroy: destroy
}
var hf = new HeaderFunctionality();
hf.init();
console.log(hf.isInitialized); // => true
hf.destroy();
console.log(hf.isInitialized); // => false
如果你想做一些“类”的事情,你可以通过以下方式实现你的目标:
function headerFunctionality() {
...same inner as above
}
var header = headerFunctionality();
header.init();
var HeaderFunctionality = function () {
this.isInitialised = false;
//other variables (with this)
}
HeaderFunctionality.prototype.init = function() {
if (!this.isInitialised) {
//do stuff here
this.isInitialised = true;
}
};
HeaderFunctionality.prototype.destroy = function() {
if (this.isInitialised) {
//do stuff here
this.isInitialised = false;
}
};
然后,您可以创建并使用标题功能对象,如下所示:
return {
init: init,
destroy: destroy
}
var hf = new HeaderFunctionality();
hf.init();
console.log(hf.isInitialized); // => true
hf.destroy();
console.log(hf.isInitialized); // => false
你想干什么?对于使用
headerfunction
创建的对象的所有实例,您都希望isinitialized
?如前所述,您的返回{..}
应该运行良好-只有在显式调用这些内部函数时,才会触发它们(尽管您必须显式调用headerFunctionality
来获取该对象,或者将其包装到IIFE中)@第四,我想在init和destroy的函数范围内使用很多变量,我只需要一个实例,因为这将在窗口大小调整时被调用。有人想解释下一票吗?这个问题包含一个明确的问题,可以通过代码复制。你想做什么?你想isInitialised
对于使用headerFunctionality创建的所有对象实例
?如前所述,您的返回{..}
应该运行良好-只有在显式调用这些内部函数时,才会触发这些内部函数(尽管您必须显式调用headerFunctionality
来获取该对象,或者将其包装到IIFE中)@第四,我想在init和destroy中的函数范围内使用很多变量,我只需要一个实例,因为这将在窗口大小调整时被调用。有人想解释下一票吗?这个问题包含一个明确的问题,可以通过代码复制。非常感谢,所以iLife是我丢失的g-你知道的时候很简单!哦,是的。我只是复制/粘贴了你的代码。当使用IIFE时,你不需要在封装的函数中使用这个。我会帮你解决的。非常感谢,所以IIFE就是我缺少的东西-你知道的时候很简单!哦,是的。我只是复制/粘贴了你的代码。当使用IIFE时,你不需要使用>这个
在封装的函数中。我将为您修复它。