Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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_Syntax - Fatal编程技术网

javascript中圆括号()的位置-不寻常的语法?

javascript中圆括号()的位置-不寻常的语法?,javascript,syntax,Javascript,Syntax,我遇到了以下代码: 现在我对javascript还相当陌生,我对语法有一些疑问。首先,MDN定义了requestAnimationFrame方法,但在本例中,他们调用它时末尾没有()符号,其次,在最后一个分号之前似乎有一个额外的()符号。我并不真正理解这两种情况下的推理,因此一些启示将非常有用 提前感谢。这就是所谓的立即调用函数表达式(缩写为IIFE)。你可以读到更多关于他们的信息 简而言之,它是一个立即执行的函数定义,并且立即执行的返回值被分配给window.requestAnimFrame。

我遇到了以下代码:

现在我对javascript还相当陌生,我对语法有一些疑问。首先,MDN定义了requestAnimationFrame方法,但在本例中,他们调用它时末尾没有()符号,其次,在最后一个分号之前似乎有一个额外的()符号。我并不真正理解这两种情况下的推理,因此一些启示将非常有用


提前感谢。

这就是所谓的立即调用函数表达式(缩写为IIFE)。你可以读到更多关于他们的信息

简而言之,它是一个立即执行的函数定义,并且立即执行的返回值被分配给
window.requestAnimFrame
。这只是设置将在
窗口中的函数。requestAnimFrame
。这里的
window.requestAnimFrame
之后没有paren,因为此代码没有执行特定的函数。它正在执行一些其他函数(因此在末尾有paren),并将该函数的结果分配给
window.requestAnimFrame
,以便将来调用该函数时,它将调用相应的函数

生命可以解释如下

作为函数定义,您知道以下语法:

function() {
}
然后将其包装在一组附加参数中,以便JS解释器将其视为一个表达式进行计算,如下所示:

(function() {
})
然后,为了执行该函数表达式,在末尾添加了
()
,以实现以下功能:

(function() {
})();
然后,在执行的函数的代码中有一个
return
语句,该语句导致立即执行的函数的结果被返回,并且返回值被分配给
window.requestAnimFrame
。简而言之,这是:

window.requestAnimFrame = (function() {
    return x;
})();
其中,
x
原来是一个函数本身,是其他一些计算的结果。在本例中使用IIFE的主要优点是预先评估一些只运行一次的代码,因此
window.requestAnimFrame
无论何时调用都会运行得更快


IIFE最常见的用途是创建一个函数作用域,将变量与父或全局作用域隔离开来,而无需创建命名函数。

这就是所谓的立即调用函数表达式(简称IIFE)。你可以读到更多关于他们的信息

简而言之,它是一个立即执行的函数定义,并且立即执行的返回值被分配给
window.requestAnimFrame
。这只是设置将在
窗口中的函数。requestAnimFrame
。这里的
window.requestAnimFrame
之后没有paren,因为此代码没有执行特定的函数。它正在执行一些其他函数(因此在末尾有paren),并将该函数的结果分配给
window.requestAnimFrame
,以便将来调用该函数时,它将调用相应的函数

生命可以解释如下

作为函数定义,您知道以下语法:

function() {
}
然后将其包装在一组附加参数中,以便JS解释器将其视为一个表达式进行计算,如下所示:

(function() {
})
然后,为了执行该函数表达式,在末尾添加了
()
,以实现以下功能:

(function() {
})();
然后,在执行的函数的代码中有一个
return
语句,该语句导致立即执行的函数的结果被返回,并且返回值被分配给
window.requestAnimFrame
。简而言之,这是:

window.requestAnimFrame = (function() {
    return x;
})();
其中,
x
原来是一个函数本身,是其他一些计算的结果。在本例中使用IIFE的主要优点是预先评估一些只运行一次的代码,因此
window.requestAnimFrame
无论何时调用都会运行得更快

IIFE最常见的用途是创建一个函数作用域,将变量与父或全局作用域隔离,而无需创建命名函数

  • 内部函数名旁边没有括号,因为它们没有被调用(执行),只是被引用。基本上,函数是检查哪个函数存在,并返回对它找到的第一个函数的引用。这样,您就可以在所有浏览器上引用该函数的可用版本
  • 末尾的额外括号是执行一个函数-启动
    (函数(回调){
    并结束
    })的匿名函数
    。这被称为and,是一种在JS中将代码分组在一起的方法,具有自己的变量范围,但会立即计算答案
  • 最终的结果是
    window.requestAnimFrame
    最终指向任何一个函数,或者指向虚拟实现
    window.setTimeout(回调,1000/60)

    该函数实际上还没有被调用,但代码现在可以调用
    window.requestAnimFrame(something)
    ,而不用担心它不存在

  • 内部函数名旁边没有括号,因为它们没有被调用(执行),只是被引用。基本上,函数是检查哪个函数存在,并返回对它找到的第一个函数的引用。这样,您就可以在所有浏览器上引用该函数的可用版本
  • 末尾的额外括号是执行一个函数-启动
    (函数(回调){
    并结束
    })的匿名函数
    。这被称为and,是一种在JS中将代码分组在一起的方法,具有自己的变量范围,但会立即计算答案
  • 最终结果是
    窗口
    
    (function(callback) {
        return window.requestAnimationFrame || 
               window.webkitRequestAnimationFrame || 
               window.mozRequestAnimationFrame ||
               window.oRequestAnimationFrame || 
               window.msRequestAnimationFrame ||
               function(callback) {
                   window.setTimeout(callback, 1000 / 60);
               };
    })()
    
    window.requestAnimFrame = (function(callback) {
        return window.requestAnimationFrame || 
               window.webkitRequestAnimationFrame || 
               window.mozRequestAnimationFrame ||
               window.oRequestAnimationFrame || 
               window.msRequestAnimationFrame ||
               function(callback) {
                   window.setTimeout(callback, 1000 / 60);
               };
    })();