确定此javascript函数的模式
这是一个我无法理解的javascript函数的简短模式。 如图所示: 注:这是根据HugoT对我原始问题答案的回答编辑的版本确定此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) }; 那么这个结构
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
为falseobject.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
为falseobject.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的规则,因为它要求您查看链接以了解问题是什么