gpt4 book ai didi

javascript - 基本 JavaScript : ()();

转载 作者:行者123 更新时间:2023-12-02 17:29:43 28 4
gpt4 key购买 nike

Possible Duplicate:
javascript function vs. ( function() { … } ());

抱歉,如果这太基础了,但是这个构造是做什么的?

(function MyFunction() {
/* Some codes ... */
})();

也许有一个特殊的术语?它对于谷歌搜索很有用,而不仅仅是将该代码段放在搜索字段中。

最佳答案

这称为直接调用模式。它定义了一个匿名函数,然后立即执行它。这对于“私有(private)”变量等很有用。如果您通常这样做:

// global namespace
var data = 'lol';
function getData() {
return data;
}

全局命名空间中会有一个变量 data,如果有人在 Web 控制台中输入 data = 123,则可能会破坏您的脚本。使用直接调用模式,您可以执行以下操作:

// global namespace
/*lotsofcodehere*/
(function MyFunction() {
// closure namespace
var data = 'lol';
this.getData = function getData() {
return data;
}
})();
// global again

在这种情况下,函数 getData 仍将存在于全局命名空间中,但无法从闭包命名空间外部访问数据。

您还会注意到,使用此模式时,MyFunction 将不存在于全局命名空间中。这是因为许多小语言规则之一,但基本上,函数始终可以通过函数内部的名称来使用。如果你有这样的事情:

// returns the amount of from--s needed to get to 0 :D
// (yes, it returns it's input number :D)
(function() {
var i = 0, keep = false;

this.countToZero = function(from) {
if(from === 0) {
keep = false; // don't keep i's contents on next invocation
return i;
}
if(!keep) i = 0; // reset i on first invocation
i++;
keep = true;
return countToZero(from - 1);
}
})();

它工作得很好,countToZero(5) 会很好地返回 5。但是,如果你在非全局命名空间中使用它,那就不太好了,如果在函数内部使用它,它会将 countToZero 定义为成员该函数的属性,这将破坏我们的返回(因为 countToZero 不再通过全局命名空间访问)
这也许不是一个现实的场景,但它适用于这个例子。我们将使用以下代码代替上面的代码:

/*code*/
this.countToZero = function countToZero(from) {
// countToZero will *always* exist here as a reference to this function!
/*code*/
return countToZero(from);
};

这段代码很难破解,除非你将 Infinity 作为第一个参数传递,即使你以完全荒谬的方式使用它。

...

我是否说过我要提供清晰的解释或很好的、现实生活中的例子?我希望我没有这么做

关于javascript - 基本 JavaScript : ()();,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8656683/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com