从另一个函数访问对象中的变量

时间:2014-05-04 12:52:35

标签: javascript

我试图从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,但仍无法弄清楚如何访问它。

4 个答案:

答案 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();

FIDDLE

答案 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)

(我想你知道myObjectMyObject是不同的东西(甚至与翻译无关,只是他们的名字相似),但也许这会引起你的困惑,所以我只是陈述这个。)

解释器将做的是首先评估作业的左侧(new MyObject()),然后将其填入变量myObject。这意味着,当您致电function MyObject() { ... } 时,变量myObject尚未初始化。显然(现在),它未定义,因此错误。

有不同的解决方法,Omri Aharon是一种可能性。