Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 初始化内部嵌套函数_Javascript - Fatal编程技术网

Javascript 初始化内部嵌套函数

Javascript 初始化内部嵌套函数,javascript,Javascript,我有以下javascript函数: var headerFunctionality=函数(){ var已初始化=错误; //其他变量 函数init(){ 如果(!此.已初始化){ //在这里做事 this.isInitialized=true; } }; 函数销毁(){ 如果(本文件已初始化){ //在这里做事 this.isInitialized=false; } }; } 我如何更改此设置,以便可以拨打电话 headerFunctionality.init(); headerFunctio

我有以下javascript函数:

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时,你不需要使用
>这个
在封装的函数中。我将为您修复它。