Javascript 定义后未定义函数变量

Javascript 定义后未定义函数变量,javascript,node.js,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); } 我进

我有这个密码

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

为什么不分配新点值?

此访问替换
var
声明。您需要将属性附加到将通过
new
创建的当前对象。如果不使用
,则在调用函数时创建它们,并在函数调用后将其删除

var Point=函数(startX,startY){
这个.x=startX;
这个。y=星形;
}
函数somefunc(数据){
var newPoint=新点(data.x,data.y);
console.log(data.x+“:”+data.y);
log(newPoint.x+“:”+newPoint.y);
}

somefunc({x:1,y:1})
var
声明替换为
访问。您需要将属性附加到将通过
new
创建的当前对象。如果不使用
,则在调用函数时创建它们,并在函数调用后将其删除

var Point=函数(startX,startY){
这个.x=startX;
这个。y=星形;
}
函数somefunc(数据){
var newPoint=新点(data.x,data.y);
console.log(data.x+“:”+data.y);
log(newPoint.x+“:”+newPoint.y);
}

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

function Point(x, y){
  this.x = x;
  this.y = y;
}
其行为等同于:

function Point(x, y){
  var context = {};

  context.x = x;
  context.y = y;

  return context;
}
但是,您也可以使用javascripts
class
语法,这可能看起来更符合逻辑:

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

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

function Point(x, y){
  this.x = x;
  this.y = y;
}
其行为等同于:

function Point(x, y){
  var context = {};

  context.x = x;
  context.y = y;

  return context;
}
但是,您也可以使用javascripts
class
语法,这可能看起来更符合逻辑:

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

您正在点内声明一个新变量“x”和“y”,该变量只能在函数内访问,因为这样声明的变量使其成为局部变量。可以对同一点使用闭包,以便创建的每个点实例中都存储有值

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);

您正在点内声明一个新变量“x”和“y”,该变量只能在函数内访问,因为这样声明的变量使其成为局部变量。可以对同一点使用闭包,以便创建的每个点实例中都存储有值

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);

你错过了
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);
当我们创建一个构造函数时,我们做得太多了,因为对象声明和返回部分在每个函数中都很常见

i、 e

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
}

因此,您必须将您的变量绑定到它,然后返回。

您缺少了
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);
当我们创建一个构造函数时,我们做得太多了,因为对象声明和返回部分在每个函数中都很常见

i、 e

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
}

因此,必须将变量绑定到要返回的对象。

变量不是上下文的属性。使用
访问上下文并为其分配属性。变量不是上下文的属性。使用
访问上下文并为其分配属性。