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

JavaScript是否在每次调用函数时都会发生内存泄漏

JavaScript是否在每次调用函数时都会发生内存泄漏,javascript,performance,memory-leaks,Javascript,Performance,Memory Leaks,目前,我正在参加一个JavaScript培训,培训师告诉我们,您编写的每个函数都是构造函数,每次调用它时,都会创建一个新对象 考虑以下代码 function Test(){ Console.log("Test"); } Test(); Test(); 所以每次我调用Test函数时,它会每次创建一个新对象吗 更新 根据他的说法,以下代码不会导致内存泄漏 function Test(name){ this.name = name; } var one = new Test("Nic

目前,我正在参加一个JavaScript培训,培训师告诉我们,您编写的每个函数都是构造函数,每次调用它时,都会创建一个新对象

考虑以下代码

function Test(){
  Console.log("Test");
}

Test();
Test();
所以每次我调用Test函数时,它会每次创建一个新对象吗

更新

根据他的说法,以下代码不会导致内存泄漏

function Test(name){
    this.name = name;
}

var one = new Test("Nicholas");
function createTest(name){
    var t = new Object();
    t.name = name;
    return t;
}

var two = createTest("Nicholas");
下面的代码将分配一个额外的对象,并将导致内存泄漏

function Test(name){
    this.name = name;
}

var one = new Test("Nicholas");
function createTest(name){
    var t = new Object();
    t.name = name;
    return t;
}

var two = createTest("Nicholas");
您编写的每个函数都是构造函数

不,那不是真的

每次调用它时,都会创建一个新对象

如果您正在使用new调用构造函数,那么是的,一个新对象将被装箱。否则,这并不总是正确的

是的,在创建对象或调用函数时不会发生内存泄漏。

每个函数都可以充当构造函数,但只有在使用关键字调用时才会创建新对象:


你对JavaScript中的新操作符感到困惑吗?想知道函数和构造函数之间的区别是什么?或者原型到底是用来干什么的

什么是构造函数

构造函数是用作构造函数的任何函数。语言没有区别。函数可以编写为用作构造函数或作为普通函数调用,也可以任意使用

构造函数与新关键字一起使用:

var Vehicle = function Vehicle() {
  // ...
}

var vehicle = new Vehicle();
调用构造函数时会发生什么? 调用new Vehicle时,JavaScript执行四项操作:

它会创建一个新对象

它将对象的构造函数属性设置为Vehicle

它设置要委托给Vehicle.prototype的对象

它在新对象的上下文中调用Vehicle

新车辆的结果就是这个新对象

一,。它将创建新对象。 这没什么特别的,只是一个新鲜的

新对象:{}

二,。它将对象的构造函数属性设置为VEHICLE

这意味着两件事:

vehicle.constructor == Vehicle  // true

vehicle instanceof Vehicle      // true
这不是一个普通的财产。如果枚举对象的属性,它将不会显示。此外,您可以尝试设置构造函数,但只需在这个特殊的构造函数上设置一个普通属性。也就是说:

vehicle;                          // {}

var FuzzyBear = function FuzzyBear() { };
vehicle.constructor = FuzzyBear;

vehicle;                          // { constructor: function FuzzyBear() }
vehicle.constructor == FuzzyBear; // true
vehicle instanceof FuzzyBear      // false
vehicle instanceof Vehicle        // true
基础的内置构造函数属性是无法手动设置的。它只能为您设置,作为新建关键字构造的一部分

三,。它设置要委托给VEHICLE.PROTOTYPE的对象

现在它变得有趣了

函数只是一种特殊的对象,与任何对象一样,函数也可以具有属性。函数自动获取名为prototype的属性,该属性只是一个空对象。这个物体得到一些特殊的处理

构造对象时,它继承其构造函数原型的所有属性。我知道,这是一个很有头脑的问题。在这里

你说了一口。
JavaScript原型链与大多数语言的工作方式稍有不同,因此理解起来很难。当JavaScript的语法使它看起来更像其他语言时,就像继承Java的新操作符一样,这并没有使它变得更容易。但是如果你知道你在做什么,你可以用它做一些疯狂的酷的事情。

没有内存泄漏。并不是每个函数都是构造函数,这取决于您如何调用它,即使用new.Test只是一个普通的旧函数调用。没有泄漏。未创建对象。您创建并保留引用的对象不是内存泄漏。这是您创建并正在使用的对象-这不是泄漏。它使用一些内存,但这是所有对象在使用它们时所做的。如果您没有在某个变量中保留对该对象的引用,那么垃圾收集器将清理它。这里没有泄漏。但如果每个函数都不是构造函数,那么调用一个函数怎么会产生内存?@code13:-那么调用一个函数怎么会产生内存?我不明白!