sách gpt4 ai đã đi

javascript - JavaScript cơ bản: ()();

In lại 作者:行者123 更新时间:2023-12-02 17:29:43 29 4
mua khóa gpt4 Nike

Có thể trùng lặp:
javascript function vs. ( function() { … } ());

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

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

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

1 Câu trả lời

这称为直接调用模式。它定义了一个匿名函数,然后立即执行它。这对于“私有(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)
(chức năng() {
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/

29 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com