定义后,函数变量未定义

时间:2018-02-01 11:38:51

标签: javascript node.js

我有这段代码

var Point = function (startX, startY) {
  var x = startX
  var y = startY
}

function somefunc (data) {
    var newPoint = new Point(data.x, data.y);
    console.log(data.x + ":" + data.y);
    console.log(newPoint.x + ":" + newPoint.y);
}

我进入控制台

0:0
undefined:undefined

为什么没有分配newPoint值?

4 个答案:

答案 0 :(得分:4)

var声明替换为this访问权限。您需要将属性附加到将通过new创建的当前对象。如果没有this,则在调用函数时会创建它们,并在函数调用后删除它们。

var Point = function (startX, startY) {
  this.x = startX;
  this.y = startY;
}

function somefunc (data) {
    var newPoint = new Point(data.x, data.y);
    console.log(data.x + ":" + data.y);
    console.log(newPoint.x + ":" + newPoint.y);
}

somefunc({x: 1, y: 1});

如果您将函数用作对象创建者, ES6 会提供特殊关键字 - class,这是 OOP 创建对象的友好方式

class Point {
  constructor(startX, startY) {
     this.x = startX;
     this.y = startY;
  }
}

function somefunc (data) {
    var newPoint = new Point(data.x, data.y);
    console.log(data.x + ":" + data.y);
    console.log(newPoint.x + ":" + newPoint.y);
}

somefunc({x: 1, y: 1});

答案 1 :(得分:0)

Javascripts继承可能会让人感到困惑。当您使用purchase_data调用函数时,它会创建一个新对象,而特殊的new变量将引用该对象。然后该函数将自动返回this。因此,要设置该对象的属性,需要将它们分配给this,因为构造函数的变量不会以任何方式公开:

this

此行为等于:

function Point(x, y){
  this.x = x;
  this.y = y;
}

但是你也可以使用javascripts function Point(x, y){ var context = {}; context.x = x; context.y = y; return context; } 语法,这可能看起来更合乎逻辑:

class

答案 2 :(得分:0)

您正在声明一个新变量' x'并且' y'内部Point只能在函数内部访问,因为这样的声明变量使它成为局部变量。您可以使用闭包,以便您创建存储在其中的点的每个实例。

var Point = function (startX, startY) {
  return {
     x: startX,
     y: startY
  }
}



var newPoint1 = new Point(10, 20);
var newPoint2 = new Point(20, 10);

console.log(newPoint2.x + ":" + newPoint2.y);
console.log(newPoint2.x + ":" + newPoint2.y);

答案 3 :(得分:0)

您错过了new关键字的神奇之处。

通常,当我们创建一个对象时,当你使用new关键字时,我们不会从函数中显式返回一个对象,就像它对我们一样。

var Point = function (startX, startY) {
  var obj = {}  // common part
  obj.x = startX;
  obj.y = startY;
  return obj //common part
}

我们称之为没有new关键字,如下所示,工作已完成

var newPoint = Point(data.x, data.y);
console.log(newPoint.x + ":" + newPoint.y);

当我们创建构造函数时,我们过度,因为对象声明和返回部分在每个函数中都很常见

即,

var obj = {}
return obj

因此new关键字为您提供了声明对象并隐式返回它的样板。

var Point = function (startX, startY) {
  var this = {}  // implicit declraration by new keyword
  this.x = startX;
  this.y = startY;
  return this  //implicit return by new keyword
}

所以你必须将你的变量绑定到你想要返回的变量。