Javascript中的闭包和原型

时间:2017-01-02 18:36:34

标签: javascript closures prototype

我是Javascript的新手。我正在尝试使用闭包和Prototype。

在下面的代码片段中,调用min函数,但是console.log(y)打印undefined。为什么这个以及this.val将引用什么对象?

function Air() {
  this.text = "Inside Air";

};

Air.prototype.min = function() {
  this.val = "Inside min";
  console.log("Inside min");
};

var x = new Air();
var y = x.min();
console.log(y);

在第二个代码段中,此代码可以正常运行。

 function Air() {
        console.log("InsiAir");
      return {
        min: function() {
          console.log("Inside min");
        }
      };
    }

var air = Air();
air.min();

虽然,这不是

function Air() {
    function min() {
        console.log("Inside Min");
    }

}

var air = Air();
air.min();

任何人都可以解释究竟发生了什么

2 个答案:

答案 0 :(得分:0)

第一个片段

function Air() {
  this.text = "Inside Air";
}

Air.prototype.min = function() {
  this.val = "Inside min";
  console.log("Inside min");
};

var x = new Air();
var y = x.min();
console.log(y);

您创建了一个新的Air对象,该对象已分配给x。在构造函数中,您可以设置新对象的text属性,该属性不会被进一步使用。然后,您在原型上找到的min上调用x方法。在该方法中,设置了一个名为val的实例属性,该属性未使用。 min登录到控制台。 min方法不返回任何内容,这与返回undefined相同。因此,undefined的值被赋值给变量yy的值undefined将记录到控制台。

第二个片段

function Air() {
   console.log("InsiAir");
   return {
     min: function() {
       console.log("Inside min");
     }
   };
 }

var air = Air();
air.min();

您调用Air()并返回一个对象。该对象被分配给变量air。您在min表示的对象上调用air方法。在min函数中,它会记录到控制台。 min函数不返回任何内容,这与返回undefined相同。忽略返回的值(虽然控制台可能会打印它)。

第三个片段

function Air() {
  function min() {
    console.log("Inside Min");
  }
}

var air = Air();
air.min();

您调用Air()函数,该函数不返回任何内容,这与返回undefined相同。 undefined的值已分配给变量air。尝试在min上调用方法undefined,这会导致运行时错误,例如"无法读取未定义的属性min"。 minAir函数中的局部函数,只能在Air内调用,但不是,因此它什么都不做。

闭包

这里没有任何东西与闭包有关,在某种意义上说这个术语通常被使用,指的是一些函数访问("关闭")外部作用域中的变量的情况。例如,扩展你的第二个例子:

 function Air() {
   var magic = 42;

   return {
     min: function() {
       return magic;
     }
   };
 }

var air = Air();
console.log(air.min());

函数/方法min现在"关闭"在外部范围内的变量magic上。即使在Air()返回后,返回对象上的min方法仍然可以访问magic变量,因此42将被记录到控制台。

答案 1 :(得分:0)

  

在第一个例子中:

function Air() {
   this.text = "Inside Air";
};

Air.prototype.min = function() {
  this.val = "Inside min";
  console.log("Inside min");
};

var x = new Air();
var y = x.min();
console.log(y);

显示undefined,因为min功能不会返回任何内容。

如果您使用var y=x.min()min函数未返回任何内容,则y变量将具有undefined值。

如果想工作,请使用:

var x = new Air();
x.min();

void方法类似。

  

在第二个片段中

Air()什么都不返回(未定义)。 undefined的值已分配给变量air。然后,当您尝试访问min方法时,您将收到错误。

  

在最后一个例子中,它不起作用,因为你没有返回任何东西。

function Air() {
    return {
        min() {
        console.log("Inside Min");
        }
    }
}
var air=Air();
air.min();