为什么我的变量未定义?
Why my variable is undefined?
我是javascript的初学者,我不知道为什么我的变量是未定义的。
这是我的代码:
function createBlockMap(data) {
//console.log(data.X + " " + data.Y + " " + data.food);
var makeOverOut = function (mesh) {
mesh.actionManager = new BABYLON.ActionManager(scene);
mesh.actionManager.registerAction(new BABYLON.SetValueAction(BABYLON.ActionManager.OnPointerOverTrigger, mesh.material, "diffuseTexture", mesh.material.diffuseTexture = new BABYLON.Texture("../assets/GrassLight.jpg", scene)));
mesh.actionManager.registerAction(new BABYLON.SetValueAction(BABYLON.ActionManager.OnPointerOutTrigger, mesh.material, "diffuseTexture", mesh.material.diffuseTexture = new BABYLON.Texture("../assets/Grass.jpg", scene)));
mesh.actionManager.registerAction(new BABYLON.InterpolateValueAction(BABYLON.ActionManager.OnPointerOutTrigger, mesh, "scaling", new BABYLON.Vector3(1, 1, 1), 150));
mesh.actionManager.registerAction(new BABYLON.InterpolateValueAction(BABYLON.ActionManager.OnPointerOverTrigger, mesh, "scaling", new BABYLON.Vector3(1.1, 1.1, 1.1), 150));
mesh.actionManager.registerAction(new BABYLON.SetValueAction(BABYLON.ActionManager.OnPickTrigger, button2Rect, "levelVisible", true))
.then(new BABYLON.SetValueAction(BABYLON.ActionManager.OnPickTrigger, button2Rect, "levelVisible", false));
}
var blockInfo = function (data) {
box = new BABYLON.Mesh.CreateBox("crate", 1, scene);
box.material = new BABYLON.StandardMaterial("Mat", scene);
box.material.diffuseTexture = new BABYLON.Texture("../assets/Grass.jpg", scene);
box.position.z = data.Y;
box.position.x = data.X;
box.position.y = 3;
ownfood = data.food;
console.log(this.ownfood);
console.log(data.food);
Linemate = data.Linemate;
Deraumere = data.Deraumere;
Sibur = data.Sibur;
Mendiane = data.Mendiane;
Phiras = data.Phiras;
Thystame = data.Thystame;
makeOverOut(box);
}
var button2Rect = new BABYLON.Rectangle2D(
{ parent: canvas, id: "buttonClickRes", x: 250, y: 250, width: 100, height: 40, fill: "#4040C0FF",
roundRadius: 10, isVisible: false,
children:
[
new BABYLON.Text2D("Food: " + blockInfo.ownfood, { id: "clickmeRes", marginAlignment: "h:center, v:center" })
]
});
if (map[data.Y] == null)
{
map[data.Y] = new Array();
}
map[data.Y][data.X] = blockInfo(data);}
即使我在 blockInfo 函数上分配 "data.food",为什么 blockInfo.ownfood 在 "button2Rect" 上未定义,我该如何解决这个问题。
谢谢
第一期
当您在函数范围内定义一个变量时,该变量是您可以在该范围内使用的局部变量,但以后将无法在该范围外访问
所以,就因为你做到了
function hello(){
var greeting = 'hi';
}
并不意味着您以后可以访问 greeting
,例如通过
hello.greeting
第二期
在 Javascript 中,函数与 类 类似,因为您可以创建函数的实例。 blockInfo
是一个函数,而不是函数的 实例 。如果你想创建一个函数的实例,你可以这样做:
myBlockInfo = new blockInfo(data)
如果你只是
myBlockInfo = blockInfo(data)
没有 new
关键字,您不会创建函数的实例(此外,myBlockInfo 的值将是未定义的,因为函数 blockInfo
不会 return任何事物)。
Javascript中有一个特殊的变量:this
。当您计划使用 new
关键字实例化函数时,您可以在函数内部使用特殊变量 this
。它是 "the current instance of the object" 的占位符。所以,如果你这样做
function blockInfo(data){
this.ownfood = data.food
}
您正在做的是将 data.food
分配给您可能创建的该函数的任何实例。因此,当您实例化该函数时,您将创建一个具有 属性、ownfood
的函数实例,您可以通过实例访问它:
myBlockInfo = new blockInfo(data)
console.log(myBlockInfo.ownfood)
// logs the value of data.food
我是javascript的初学者,我不知道为什么我的变量是未定义的。
这是我的代码:
function createBlockMap(data) {
//console.log(data.X + " " + data.Y + " " + data.food);
var makeOverOut = function (mesh) {
mesh.actionManager = new BABYLON.ActionManager(scene);
mesh.actionManager.registerAction(new BABYLON.SetValueAction(BABYLON.ActionManager.OnPointerOverTrigger, mesh.material, "diffuseTexture", mesh.material.diffuseTexture = new BABYLON.Texture("../assets/GrassLight.jpg", scene)));
mesh.actionManager.registerAction(new BABYLON.SetValueAction(BABYLON.ActionManager.OnPointerOutTrigger, mesh.material, "diffuseTexture", mesh.material.diffuseTexture = new BABYLON.Texture("../assets/Grass.jpg", scene)));
mesh.actionManager.registerAction(new BABYLON.InterpolateValueAction(BABYLON.ActionManager.OnPointerOutTrigger, mesh, "scaling", new BABYLON.Vector3(1, 1, 1), 150));
mesh.actionManager.registerAction(new BABYLON.InterpolateValueAction(BABYLON.ActionManager.OnPointerOverTrigger, mesh, "scaling", new BABYLON.Vector3(1.1, 1.1, 1.1), 150));
mesh.actionManager.registerAction(new BABYLON.SetValueAction(BABYLON.ActionManager.OnPickTrigger, button2Rect, "levelVisible", true))
.then(new BABYLON.SetValueAction(BABYLON.ActionManager.OnPickTrigger, button2Rect, "levelVisible", false));
}
var blockInfo = function (data) {
box = new BABYLON.Mesh.CreateBox("crate", 1, scene);
box.material = new BABYLON.StandardMaterial("Mat", scene);
box.material.diffuseTexture = new BABYLON.Texture("../assets/Grass.jpg", scene);
box.position.z = data.Y;
box.position.x = data.X;
box.position.y = 3;
ownfood = data.food;
console.log(this.ownfood);
console.log(data.food);
Linemate = data.Linemate;
Deraumere = data.Deraumere;
Sibur = data.Sibur;
Mendiane = data.Mendiane;
Phiras = data.Phiras;
Thystame = data.Thystame;
makeOverOut(box);
}
var button2Rect = new BABYLON.Rectangle2D(
{ parent: canvas, id: "buttonClickRes", x: 250, y: 250, width: 100, height: 40, fill: "#4040C0FF",
roundRadius: 10, isVisible: false,
children:
[
new BABYLON.Text2D("Food: " + blockInfo.ownfood, { id: "clickmeRes", marginAlignment: "h:center, v:center" })
]
});
if (map[data.Y] == null)
{
map[data.Y] = new Array();
}
map[data.Y][data.X] = blockInfo(data);}
即使我在 blockInfo 函数上分配 "data.food",为什么 blockInfo.ownfood 在 "button2Rect" 上未定义,我该如何解决这个问题。
谢谢
第一期
当您在函数范围内定义一个变量时,该变量是您可以在该范围内使用的局部变量,但以后将无法在该范围外访问 所以,就因为你做到了
function hello(){
var greeting = 'hi';
}
并不意味着您以后可以访问 greeting
,例如通过
hello.greeting
第二期
在 Javascript 中,函数与 类 类似,因为您可以创建函数的实例。 blockInfo
是一个函数,而不是函数的 实例 。如果你想创建一个函数的实例,你可以这样做:
myBlockInfo = new blockInfo(data)
如果你只是
myBlockInfo = blockInfo(data)
没有 new
关键字,您不会创建函数的实例(此外,myBlockInfo 的值将是未定义的,因为函数 blockInfo
不会 return任何事物)。
Javascript中有一个特殊的变量:this
。当您计划使用 new
关键字实例化函数时,您可以在函数内部使用特殊变量 this
。它是 "the current instance of the object" 的占位符。所以,如果你这样做
function blockInfo(data){
this.ownfood = data.food
}
您正在做的是将 data.food
分配给您可能创建的该函数的任何实例。因此,当您实例化该函数时,您将创建一个具有 属性、ownfood
的函数实例,您可以通过实例访问它:
myBlockInfo = new blockInfo(data)
console.log(myBlockInfo.ownfood)
// logs the value of data.food