当前位置: 首页 > 面试题库 >

高级JavaScript:为什么将此函数括在括号中?[重复]

李华茂
2023-03-14
问题内容

我碰到了这段JavaScript代码,但是我不知道该怎么做。运行此代码时为什么会得到“1”?(1)的这个奇怪的小附录是什么?为什么函数用括号括起来?

(function(x){
    delete x;
    return x;
})(1);

问题答案:

这里发生了一些事情。首先是立即调用的函数表达式(IIFE)模式:

(function() {
  // Some code
})();

这提供了一种在自己的范围内执行某些JavaScript代码的方法。通常使用它,以便在函数内创建的任何变量都不会影响全局范围。您可以改用以下方法:

function foo() {
  // Some code
}
foo();

但这需要给函数起一个名字,但这并不总是必须的。使用命名函数还意味着将来可能再次调用该函数,这可能是不希望的。通过以这种方式使用匿名函数,可以确保仅执行一次。

此语法无效:

function() {
  // Some code
}();

因为您必须将函数包装在括号中才能使其解析为表达式。

因此,快速回顾一下IIFE模式:

(function() {
  // Some code
})();

允许立即执行“某些代码”,就像它们只是内联编写一样,也可以在其自己的范围内执行,以免影响全局名称空间(并因此可能干扰其他脚本或被其他脚本干扰)。

您可以像普通函数一样将参数传递给函数,例如,

(function(x) {
  // Some code
})(1);

因此,我们将值“ 1”作为第一个参数传递给函数,该函数将其作为局部范围的变量(名为x)接收。

其次,您可以了解函数代码本身:

delete x;
return x;

删除运算符将从对象中删除属性。它不会删除变量。所以;

var foo = {'bar':4, 'baz':5};
delete foo.bar;
console.log(foo);

结果记录如下:

{'baz':5}

鉴于,

var foo = 4;
delete foo;
console.log(foo);

将记录值4,因为foo是变量而不是属性,因此无法删除。

许多人认为,由于autoglobals的工作方式,delete可以删除变量。如果在没有先声明的情况下分配变量,则它实际上不会成为变量,而是全局对象上的属性:

bar = 4; // Note the lack of 'var'. Bad practice! Don't ever do this!
delete bar;
console.log(bar); // Error - bar is not defined.

这次删除有效,因为您不是要删除变量,而是要删除全局对象上的属性。实际上,上一个代码段与此等效:

window.bar = 4;
delete window.bar;
console.log(window.bar);

现在,您将看到它与foo对象示例而不是foo变量示例的相似之处。



 类似资料:
  • 问题内容: 我不知道以下内容: 我的问题是: 将函数放在方括号.ie中是什么意思? 函数结束时,这组括号会做什么? 我通常在jquery代码和其他一些JavaScript库中看到这些。 问题答案: 您将立即使用特定参数调用匿名函数。 一个例子: 这提醒“ 彼得 ”。 对于jQuery,您可以将其作为参数传递并在函数中使用。因此,您仍然可以在noConflict-mode中使用jQuery,但可以使

  • 这里我理解哈希(#)符号将定义为本地模板变量,但是前面的星号是什么意思呢?还有,有必要吗? 下面是使用括号的示例: 我有点理解周围的括号将它绑定到HTML属性/Angular指令。这是否意味着它们是Angular计算表达式的指针?就像是Angular 1中的的等价物? 我猜真正的问题是,这些符号在Angular 2中有特殊的含义吗,知道何时使用每一个的最简单的方法是什么?谢谢!!

  • 问题内容: 我在jQuery文件中找到了这个: 花括号做什么? 问题答案: 在您的情况下,这是一个传递给CSS函数的对象。 在这里你也可以使用 这是物体的另一个例子

  • 问题内容: 我在弄清楚csv.dictreader的参数时遇到了麻烦,并且意识到我不知道方括号表示什么。 从文档中: 我希望对类实例化​​的参数进行总结。 谢谢 问题答案: 方括号表示这些参数是 可选的 。您可以忽略它们。 因此,在这种情况下,您仅 需要 将参数传递给。如果您要传递第二个参数,它将被解释为参数。第三个是,等等。 如果只想指定eg和,则必须显式命名关键字参数,如下所示: 有关关键字参

  • 最新在看typeScript文档,有个地方不了解,函数方法括号后面的: number 是什么意思?是指最后return的结果也必须是number类型吗?

  • 我知道有一个几乎类似的问题,在打字脚本中,用尖括号“<>”括一个类意味着什么? 但是当我发现它在一个接口中以一种复杂的方式(对于新手来说)声明一个函数时,我仍然感到困惑。 尖括号被多次使用(甚至是递归使用)。我怎么看?