gpt4 book ai didi

javascript - 比较预先声明和自调用的匿名函数

转载 作者:行者123 更新时间:2023-11-30 13:21:47 25 4
gpt4 key购买 nike

这将是一个快速的讨论,但我只是想就我今天早上的一个启示提供一些反馈。知道这...

var addTwoNumbers = function(intOne, intTwo) {
if ((typeof intOne == 'number') && (typeof intTwo == 'number')) {
document.write(intOne + intTwo);
} else {
document.write('Unable to perform operation.');
}
};

addTwoNumbers(3, 4);

... 行为与此基本相同...

(function(intOne, intTwo) {
if ((typeof intOne == 'number') && (typeof intTwo == 'number')) {
document.write(intOne + intTwo);
} else {
document.write('Unable to perform operation.');
}
})(3, 4);

... 是说自调用函数中的第一组括号是绕过或通过引用绕过函数执行的“工具”?实际上,() 是方法的名称,而不是实际的方法名称?另外,因为函数是在执行时直接声明的,它是否比使用变量名引用的技术更快?只是想知道。

最佳答案

好吧,这就是编写“自调用函数”(实际上不是“自调用”;有一个显式调用并且它在函数本身的外部)的原因(按照惯例)作为带括号的子表达式。

JavaScript 有两个涉及关键字function 的结构:

  1. 函数声明语句,它定义了一个函数对象并将其绑定(bind)到局部作用域中的名称(以及函数的局部作用域中,但我们暂时忽略它):

    function foo() { /* code */ }
  2. 函数实例化子表达式,它在表达式的上下文中创建一个函数对象:

    var f = function() { /* code */ };

当您想要第二个东西时,问题就来了,并且您希望它位于表达式语句的开头。当语句以关键字 开始时function,解析器假定您正在执行上面的 1,而不是 2。因此,通过在函数 instantiation 周围引入圆括号——请记住,总是允许给子表达式加上圆括号,并且不会以任何方式影响它的值——可以使用 function 关键字被解释为上面的 2

还有其他方法可以强制解析器将语句也视为表达式:

  • !function() {/* code */}();
  • 0, function() {/* code */}();
  • +function() {/* code */}();

只是一些例子。

至于性能,这里不是问题。我要注意的一件事是,这种将标识符绑定(bind)到函数对象的方式:

var name = function() { /* code */ };

真的不比:

function name() { /* code */ }

在某些方面,情况更糟。特别是,使用函数声明语句提供的名称将显示在堆栈跟踪中,而使用 var 定义函数则不会。

关于javascript - 比较预先声明和自调用的匿名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10032440/

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