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

Javascript 什么是自由变量?

Javascript 什么是自由变量?,javascript,closures,free-variable,Javascript,Closures,Free Variable,Javascript闭包定义说: “闭包”是一个表达式(通常是一个函数),它可以有 变量以及绑定这些变量的环境 (即“关闭”表达式) 有人能给我解释一下自由变量的概念吗?这个概念是Javascript特有的还是也适用于其他语言?自由变量只是既不是本地声明的变量,也不是作为参数传递的变量 在计算机编程中,术语自由变量指变量 用于非局部变量或其参数的函数中 功能。术语“非局部变量”通常是该术语的同义词 上下文 在javascript闭包中,这些变量只是函数在声明闭包的封闭范围内或父范围内获取(读写

Javascript闭包定义说:

“闭包”是一个表达式(通常是一个函数),它可以有 变量以及绑定这些变量的环境 (即“关闭”表达式)


有人能给我解释一下自由变量的概念吗?这个概念是Javascript特有的还是也适用于其他语言?

自由变量只是既不是本地声明的变量,也不是作为参数传递的变量

在计算机编程中,术语自由变量指变量 用于非局部变量或其参数的函数中 功能。术语“非局部变量”通常是该术语的同义词 上下文

在javascript闭包中,这些变量只是函数在声明闭包的封闭范围内或父范围内获取(读写)的变量

看看这个现实世界的例子:

Gol.prototype._ensureInit = function() {
    ...
    var _this = this;
    var setDim = function() {
        _this.w = _this.canvas.clientWidth;
        _this.h = _this.canvas.clientHeight;
        _this.canvas.width = _this.w;
        _this.canvas.height = _this.h;
        _this.dimChanged = true;
        _this.draw();
    };
    setDim();
    window.addEventListener('resize', setDim);
    ...
};
在本例中,关闭点从
setDim
函数指向在封闭范围内声明的变量
\u。此变量未在
setDim
中声明,也未传递。这是一个“自由变量”

请注意,
\u此
不会成为函数的变量
setDim
:在相同范围内声明的另一个函数将共享相同的变量。

例如:

var myModule = (function (){
   var moduleVar; // closure variable

   return function(){
     // actual function
   }
})();
这里定义的变量是一个闭包变量。它可以用于整个闭包本身,但不是全局名称空间的一部分。

一个“自由翻译”可以是:
“超出范围”-变量

由于ECMAscript使用词法作用域,所以自由变量是在父作用域中定义并通过作用域链搜索查找的变量

(function _outerScope() {
    var foo = 42;

    (function _innerScope() {
        var bar = 100;

        console.log( foo + bar ); // 142
    }());
}());
在上面的示例中,
foo
\u innerScope
上下文中的自由变量。如果我们快速浏览一下ECMAscript的基本概念,就会发现这一点

上下文链接到一个激活对象(在ES3中),分别是一个词法环境记录(在ES5中),它包含如下内容:
函数声明
变量用var和
形式参数声明
,以及对所有父激活对象/词法环境的引用。如果需要访问变量,ECMAscript引擎将首先从当前上下文本身查看AOs/LE;如果在那里找不到,它会查找父AO/LE


由于任何上下文都将此数据存储在类似数组的结构中(别忘了,我们这里讨论的是实现级别,而不是Javascript本身),所以我们讨论的是
词法范围
,因为我们按顺序搜索所有的父上下文。

我不记得我读过多少次JS书籍,并修改了一些包含闭包主题的主题

答案只是对公认答案的补充

以下示例摘自

现在你可以理解

自由变量是指函数中使用的变量 不是局部变量,也不是该函数的参数


“在此上下文中,这些只是函数在声明闭包的封闭范围内获取(读取和写入)的变量。”不确定这是什么意思?你能用一个例子解释一下吗?@Geek我添加了一个现实世界的例子一个自由变量就是一个变量,它不是在给定的函数中声明的,而是在函数中使用的。顺便说一下,所有的全局变量都是自由变量,但不是所有的自由变量都是全局变量。
// text is a free variable of the arrow function.
const sayLater = (text, when) => {
  //         vv
  let task = () => console.log(text) // (heed no 'text' variable here) => console.log(text)
  setTimeout(task, when)
}