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

Javascript在内存中“保存”函数数据?

Javascript在内存中“保存”函数数据?,javascript,Javascript,: 当我调用4°函数时,它如何记住myPoint的值?事实上,输出是第3行,所以对于每个函数,myPoint值必须存储在某处 那么,它在堆栈内存中存储了10个myFunct定义 希望我的意思很清楚 那么,它在堆栈内存中存储了10个myFunct定义 是的 您的数组包含十个闭包,每个闭包都捕获了自己版本的myPoint 那么,它在堆栈内存中存储了10个myFunct定义 是的 您的数组包含十个闭包,每个闭包都捕获了自己版本的myPoint。它被称为闭包。创建新函数时,当前在范围内的所有变量都与该闭

:

当我调用4°函数时,它如何记住myPoint的值?事实上,输出是第3行,所以对于每个函数,myPoint值必须存储在某处

那么,它在堆栈内存中存储了10个myFunct定义

希望我的意思很清楚

那么,它在堆栈内存中存储了10个myFunct定义

是的

您的数组包含十个闭包,每个闭包都捕获了自己版本的myPoint

那么,它在堆栈内存中存储了10个myFunct定义

是的


您的数组包含十个闭包,每个闭包都捕获了自己版本的myPoint。

它被称为闭包。创建新函数时,当前在范围内的所有变量都与该闭包相关联。

它称为闭包。创建新函数时,当前在作用域中的所有变量都与该闭包相关联。

Thiefmaster很好地回答了您的问题。是的,这段代码将使用越来越多的内存,具体取决于数组包含的闭包数量。必须指出的是,大多数现代引擎都会将引用分配给MyFunct变量的函数和包含闭包变量的特定调用对象。换言之,您的数组将沿着以下几行显示:

myFuncArray[0] = {call:
                     {myPoint:'Whatever value was passed to the addValues function the first time'},
                  valueOf: myFunct};
//the actual value is a reference to myFunct
//JS provides an implicit link to the call property, which is bound to this particular reference
myFuncArray[1] = {call:
                     {myPoint:'The value passed to addValues the second time'},
                 valueOf: myFunct};
您无法访问对象本身,但这只是思考JS如何在内存中保持组织的方式。 稍微偏离主题,但您正在使用MyFunct变量创建一个隐含的全局变量:

function addValues(myPoint)
{
    var anotherClosureVar = 'This will be accessible, too: it\'s part of the closure';
    var myFunct = function()
    {//use var to declare in addValues scope, instead of using an implied global
        var myVar="Line " + myPoint;
        console.log(myVar);
        console.log(anotherClosureVar);//will work, too
    };
    myFunctArray.push(myFunct);
}

总而言之,如果这是您的代码,内存不应该是一个大问题。即使这段代码是在旧的JScript引擎上运行的,也需要一段时间才能用完有意义的内存。尽管如此,思考这样的事情是一个好习惯,我希望我在这里讲得有道理,我不是一个母语为英语的人,这使得解释JS更抽象的方面有些棘手

Thiefmaster回答了你的问题。是的,这段代码将使用越来越多的内存,具体取决于数组包含的闭包数量。必须指出的是,大多数现代引擎都会将引用分配给MyFunct变量的函数和包含闭包变量的特定调用对象。换言之,您的数组将沿着以下几行显示:

myFuncArray[0] = {call:
                     {myPoint:'Whatever value was passed to the addValues function the first time'},
                  valueOf: myFunct};
//the actual value is a reference to myFunct
//JS provides an implicit link to the call property, which is bound to this particular reference
myFuncArray[1] = {call:
                     {myPoint:'The value passed to addValues the second time'},
                 valueOf: myFunct};
您无法访问对象本身,但这只是思考JS如何在内存中保持组织的方式。 稍微偏离主题,但您正在使用MyFunct变量创建一个隐含的全局变量:

function addValues(myPoint)
{
    var anotherClosureVar = 'This will be accessible, too: it\'s part of the closure';
    var myFunct = function()
    {//use var to declare in addValues scope, instead of using an implied global
        var myVar="Line " + myPoint;
        console.log(myVar);
        console.log(anotherClosureVar);//will work, too
    };
    myFunctArray.push(myFunct);
}

总而言之,如果这是您的代码,内存不应该是一个大问题。即使这段代码是在旧的JScript引擎上运行的,也需要一段时间才能用完有意义的内存。不过,考虑这样的事情是一个好习惯,我希望我在这里讲得有道理,我不是一个母语人士,这使得解释JS更抽象的方面有些棘手

一个好的JS引擎可能只存储一次函数;多次存储函数代码并没有什么意义,只是每次存储的范围都需要不同,希望如此。一个好的JS引擎可能只存储一次函数;多次存储函数代码并没有什么意义,只是每次存储的范围都需要不同,希望如此。我并不打算暗示其他情况。