我试图从MyFunction访问myObject中的变量myVar,但是得到了这个错误
Uncaught TypeError: Cannot read propperty 'myVar' of undefined
运行以下代码时。
var myObject;
function MyObject(){
this.myVar = 500;
MyFunction();
}
function MyFunction(){
alert(myObject.myVar);
}
myObject = new MyObject();
我已阅读this,但仍无法弄清楚如何访问它。
答案 0 :(得分:2)
当调用一个函数时,它被执行,然后结果返回给变量。
因此,该函数执行 first ,然后将结果传递回变量
var myObject; // 1. new variable, undefined
function MyObject(){ // 3. execute function
this.myVar = 500; // 4. set a property
MyFunction(); // 5. call next function
}
function MyFunction(){
alert(myObject.myVar); // 6. myObject is still undefined,
} // result hasn't returned yet
myObject = new MyObject(); // 2. call function - 7. When everything is done
// executing, the result
// is returned
换句话说, 你无法做到 。
解决这个问题的一种方法是对MyFunction进行原型设计并保持this
的值不变
function MyObject() {
this.myVar = 500;
this.MyFunction();
}
MyObject.prototype.MyFunction = function() {
alert(this.myVar);
}
var myObject = new MyObject();
答案 1 :(得分:1)
你可以找到一篇好文章HERE
这是一个定义你想要的函数的例子:FIDDLE
function MyObject() {
this.myVar = 500;
this.MyFunction();
}
MyObject.prototype.MyFunction = function() {
alert(this.myVar);
};
myObject = new MyObject();
答案 2 :(得分:1)
问题是myObject
是在调用MyObject
之后分配的,所以如果在其中,myObject
仍未定义。
一些替代方案:
function MyObject(){
this.myVar = 500;
myFunction.call(this); // Pass object as `this`
}
function myFunction(){
alert(this.myVar);
}
var myObject = new MyObject();
或
function MyObject(){
this.myVar = 500;
myFunction(this); // Pass object as argument
}
function myFunction(obj){
alert(obj.myVar);
}
var myObject = new MyObject();
或
var myObject;
function MyObject(){
this.myVar = 500;
}
function myFunction(obj){
alert(myObject.myVar);
}
var myObject = new MyObject(); // Now myObject is set
myFunction(); // Call `myFunction` after `MyObject`, not inside it.
或
var myObject;
function MyObject(){
this.myVar = 500;
this.myFunction(); // Prototype method
}
MyObject.prototype.myFunction = function(){
alert(this.myVar);
}
var myObject = new MyObject();
或
var myObject;
function MyObject(){
var that = this;
function myFunction(){ /* Place myFunction inside MyObject. Note that this
way each instance will have a copy of myFunction */
alert(that.myVar);
}
this.myVar = 500;
myFunction();
}
var myObject = new MyObject();
答案 3 :(得分:1)
(我想你知道myObject
和MyObject
是不同的东西(甚至与翻译无关,只是他们的名字相似),但也许这会引起你的困惑,所以我只是陈述这个。)
解释器将做的是首先评估作业的左侧(new MyObject()
),然后将其填入变量myObject
。这意味着,当您致电function MyObject() { ... }
时,变量myObject
尚未初始化。显然(现在),它未定义,因此错误。
有不同的解决方法,Omri Aharon是一种可能性。