Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.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,我有这样的代码:(在JSFIDLE上) 代码运行良好。但是我认为(function(){})()是一个闭包。为什么我可以访问其中的标记。它不是对全局名称空间的污染吗?您没有使用标记,因此它是一个全局变量,而不是作用于函数。您没有使用标记,因此它是一个全局变量,而不是作用于函数。因为您没有将var放在标记前面,这就是它在全局级别创建的原因。因为您没有将var放在标记前面,这就是它在全局级别创建的原因。您的代码不是一个闭包。闭包如下所示,您需要将函数返回,注意变量version超出了返回的函数范围

我有这样的代码:(在JSFIDLE上)


代码运行良好。但是我认为
(function(){})()是一个闭包。为什么我可以访问其中的
标记
。它不是对全局名称空间的污染吗?

您没有使用
标记
,因此它是一个全局变量,而不是作用于函数。

您没有使用
标记
,因此它是一个全局变量,而不是作用于函数。

因为您没有将
var
放在标记前面,这就是它在全局级别创建的原因。

因为您没有将
var
放在标记前面,这就是它在全局级别创建的原因。

您的代码不是一个闭包。闭包如下所示,您需要将函数返回,注意变量
version
超出了返回的函数范围

var Marker = (function(){
    var version = "2012.Jul.06";
    return function(opts){
        var marker = this;
        marker.Version = version;
        marker.HelloWorld = function(){
            return marker.Version;
        };
    };
})();

您可以访问
标记
,因为它是代码中的全局变量

您的代码不是一个闭包。闭包如下所示,您需要将函数返回,注意变量
version
超出了返回的函数范围

var Marker = (function(){
    var version = "2012.Jul.06";
    return function(opts){
        var marker = this;
        marker.Version = version;
        marker.HelloWorld = function(){
            return marker.Version;
        };
    };
})();

您可以访问
标记
,因为它是代码中的全局变量

闭包只是上限。例如:

( function() {
    var i = 0;
    ( function() {
        // i is in the closure, the upper scope
    } () );
} () );
不要忘记javascript的唯一作用域是函数作用域

var Marker = (function(){
    var version = "2012.Jul.06";
    return function(opts){
        var marker = this;
        marker.Version = version;
        marker.HelloWorld = function(){
            return marker.Version;
        };
    };
})();
(函数(){})()
是一个立即调用的函数表达式


但是,对你的例子来说,问题在于你错过了
var
,因此
Marker
是一个全局变量。

闭包只是上限范围。例如:

( function() {
    var i = 0;
    ( function() {
        // i is in the closure, the upper scope
    } () );
} () );
不要忘记javascript的唯一作用域是函数作用域

var Marker = (function(){
    var version = "2012.Jul.06";
    return function(opts){
        var marker = this;
        marker.Version = version;
        marker.HelloWorld = function(){
            return marker.Version;
        };
    };
})();
(函数(){})()
是一个立即调用的函数表达式



但是,对你的例子来说,问题在于你错过了
var
,因此
Marker
是一个全局变量。

你似乎把“闭包”(函数环绕变量)和“clojure”(编程语言)混淆了。键入方法为我改变了它。感谢帮助:)如果您认为闭包可以访问更高范围内的所有变量,那么是的,它是一个闭包,因为所有函数都具有该特性。但严格地说,如果一个函数在其创建的上下文(例如,另一个函数)终止后仍然可以访问,那么它只是一个闭包。从这个角度来看,这不是一个闭包,因为您正在定义函数并立即执行它。这个“模式”与闭包没有什么关系,它是通过执行一个函数来创建作用域的。@FelixKling我开始学习js和闭包。说到这个例子,我能想象在这个
模式中添加一个真正的闭包的代码吗?闭包是一个函数+对封闭环境的引用。函数本身不是闭包。不引用封闭环境的函数不需要实现为闭包。您似乎把“闭包”(函数围绕变量)与“clojure”(编程语言)混淆了。键入方法为我改变了它。感谢帮助:)如果您认为闭包可以访问更高范围内的所有变量,那么是的,它是一个闭包,因为所有函数都具有该特性。但严格地说,如果一个函数在其创建的上下文(例如,另一个函数)终止后仍然可以访问,那么它只是一个闭包。从这个角度来看,这不是一个闭包,因为您正在定义函数并立即执行它。这个“模式”与闭包没有什么关系,它是通过执行一个函数来创建作用域的。@FelixKling我开始学习js和闭包。说到这个例子,我能想象在这个
模式中添加一个真正的闭包的代码吗?闭包是一个函数+对封闭环境的引用。函数本身不是闭包。并且不引用封闭环境的函数不需要作为闭包实现。+1很好。因此,在没有
var
的情况下,
标记
被附加到
窗口
<代码>窗口标记
?+1个漂亮的捕捉。因此,在没有
var
的情况下,
标记
被附加到
窗口
<代码>窗口标记
?@FlorianMargaine不是吗?你能再解释一下吗?这是个了结。Clojure是一种编程语言。@xdazz的“closure”拼写为s。由于这是唯一正确的答案,我不会拒绝投票,但也不能向上投票。每个函数在词法范围内都是闭包,例如相对于父范围:这是错误的。闭包不需要返回
。想象一下,使用一个传递到当前词法范围之外的立即调用函数的情况。(但它确实正确地指出,
标记
是一个窗口属性。)@FlorianMargaine,不是吗?你能再解释一下吗?这是个了结。Clojure是一种编程语言。@xdazz的“closure”拼写为s。由于这是唯一正确的答案,我不会拒绝投票,但也不能向上投票。每个函数在词法范围内都是闭包,例如相对于父范围:这是错误的。闭包不需要返回
。想象一下,使用一个传递到当前词法范围之外的立即调用函数的情况。(但是,它正确地指出,
标记
是一个窗口属性。)他也缺少了
返回
,就像你的例子一样,但你也调用了封闭函数,这只是胡说八道。@potatosatter这个例子只是为了说明闭包的原理,它不是一个工作示例。他也缺少
返回
,就像你的例子一样,但是你也调用了封闭函数,这完全是胡说八道。@potatosatter这个例子只是为了说明闭包的原理,它不是一个有效的例子。