Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.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_Closures - Fatal编程技术网

确定此javascript函数的模式

确定此javascript函数的模式,javascript,closures,Javascript,Closures,这是一个我无法理解的javascript函数的简短模式。 如图所示: 注:这是根据HugoT对我原始问题答案的回答编辑的版本 function D(arg) { return function () { return arg > 10; //arg is captured in this function's closure } }; object = { x: D(11), y: D(9), z: D(12) }; 那么这个结构

这是一个我无法理解的javascript函数的简短模式。 如图所示:

注:这是根据HugoT对我原始问题答案的回答编辑的版本

function D(arg) {
   return function () { 
       return arg > 10; //arg is captured in this function's closure 
   }
};

object = {
    x: D(11),
    y: D(9),
    z: D(12)
};
那么这个结构是如何工作的呢? 我可以看到返回是一个对象。 但是我不能把这些东西放在一起。 这是一种封闭模式吗?
有人能解释一下流程吗?

是的,这是一种闭合模式。传递给D的任何参数都会在从D返回的函数的闭包中捕获。但是,您编写的内容与链接的代码中的内容不同

这是您链接的代码的重要部分

function D(arg) {
   return function () { 
       return arg > 10; //arg is captured in this function's closure 
   }
};

object = {
    x: D(11),
    y: D(9),
    z: D(12)
};
值11、9和12将在函数
object.x
object.y
object.z
中捕获


因此
object.x()
将返回true,而
object.y
将返回false,因为
9>10
为false
object.z()
将返回true,因为这是一个闭包模式。传递给D的任何参数都会在从D返回的函数的闭包中捕获。但是,您编写的内容与链接的代码中的内容不同

这是您链接的代码的重要部分

function D(arg) {
   return function () { 
       return arg > 10; //arg is captured in this function's closure 
   }
};

object = {
    x: D(11),
    y: D(9),
    z: D(12)
};
值11、9和12将在函数
object.x
object.y
object.z
中捕获


因此
object.x()
将返回true,而
object.y
将返回false,因为
9>10
为false
object.z()
将返回true,因为
12>10

让我们分解
ua.js
看看发生了什么。洋葱的最外层是一个匿名函数:

var UA = (function (window, navigator) 
{ 
   /* anonymous function contents */  
}(window, navigator));
所以UA被设置为这个匿名函数的返回值。那么匿名函数做什么呢?它设置一个变量
ua

var ua = (window.navigator && navigator.userAgent) || "";
它定义了一个函数
detect
,该函数返回一个匿名函数,根据
模式测试ua的内容

function detect(pattern) {
    return function () {
        return (pattern).test(ua);
    };
}
请注意,调用
detect(/something/)
不会返回
(/something/).test(ua)
的值。它只返回一个将按需执行测试的闭包

现在我们找到了外部匿名函数的返回值,如下所示(我删掉了注释):

这将返回
对象的一个实例,该实例包含许多函数(
isChrome
等),这些函数是通过调用
detect()
创建的闭包。这意味着那些
(pattern).test(ua)
检查的执行被推迟,直到有人真正调用
ua.isChrome()
等等


您可以想象另一种方法,其中所有测试都提前执行,UA成为包含一组标志的对象。这将有(可能相当小)的执行模式匹配的开销,而您作为开发人员并不感兴趣。

让我们来分析一下
ua.js
,看看发生了什么。洋葱的最外层是一个匿名函数:

var UA = (function (window, navigator) 
{ 
   /* anonymous function contents */  
}(window, navigator));
所以UA被设置为这个匿名函数的返回值。那么匿名函数做什么呢?它设置一个变量
ua

var ua = (window.navigator && navigator.userAgent) || "";
它定义了一个函数
detect
,该函数返回一个匿名函数,根据
模式测试ua的内容

function detect(pattern) {
    return function () {
        return (pattern).test(ua);
    };
}
请注意,调用
detect(/something/)
不会返回
(/something/).test(ua)
的值。它只返回一个将按需执行测试的闭包

现在我们找到了外部匿名函数的返回值,如下所示(我删掉了注释):

这将返回
对象的一个实例,该实例包含许多函数(
isChrome
等),这些函数是通过调用
detect()
创建的闭包。这意味着那些
(pattern).test(ua)
检查的执行被推迟,直到有人真正调用
ua.isChrome()
等等


您可以想象另一种方法,其中所有测试都提前执行,UA成为包含一组标志的对象。这将有(可能相当小)的执行模式匹配的开销,而您作为开发人员并不感兴趣。

Oh ok。。您使用一些虚拟值的解释很有帮助。非常感谢。是的,我实际上没有考虑到重要的部分!很好,很高兴能为您服务。“这是您链接的代码的重要部分简化了”OP没有“简化”它,他们将其呈现为无意义的。@t.J.Crowder为了解释代码的作用,它肯定比codin链接的开始要简单。用真正的代码做这样的事情可能没有多大意义,但在解释方法时,它工作得很好。@HugoT:我不同意。在一个问题中,显示无意义的代码而不是无意义的代码是没有用的,它打破了SO的规则,因为它要求您查看链接,找出问题实际上与什么相关。我很高兴你能够帮助OP,尽管这个问题有这些缺陷(很久以前,你就把答案投了-)。哦,好吧。。您使用一些虚拟值的解释很有帮助。非常感谢。是的,我实际上没有考虑到重要的部分!很好,很高兴能为您服务。“这是您链接的代码的重要部分简化了”OP没有“简化”它,他们将其呈现为无意义的。@t.J.Crowder为了解释代码的作用,它肯定比codin链接的开始要简单。用真正的代码做这样的事情可能没有多大意义,但在解释方法时,它工作得很好。@HugoT:我不同意。在一个问题中,显示无意义的代码而不是无意义的代码是没有用的,它打破了SO的规则,因为它要求您查看链接以了解问题是什么