2012-05-24 28 views
4

考慮此errorful代碼:在一個javascript對象訪問的內變量

x = { 
    y : "why", 
    z : function() { 
    return y + " zed"; 
    } 
} 

函數z不起作用: 「的ReferenceError:Y沒有定義」。

有沒有辦法從函數z中訪問y而沒有完全指定它爲x.y?

我當然可以改寫這個作爲

x = function() { 
    var self = this; 
    this.y = "why"; 
    this.z = function() { 
    return self.y + " zed"; 
    }; 
    return this; 
}(); 

...但天哪。

回答

3

只需使用this如果調用函數與x.z()

var x = { 
    y : "why", 
    z : function() { 
     return this.y + " zed"; 
    } 
}; 

DEMO:http://jsfiddle.net/hZxVu/

+3

這並不是絕對可靠的 - 考慮變種Z = x.z; Z(); //「undefined zed」 – meouw

+0

@meouw的確,除此之外,我沒有看到OP的「重寫」變體以外的其他選項。 – VisioN

+0

@meouw偉大的一點。我也錯過了。我認爲你可以用一個閉包來使事情複雜化,以確保y總是在:http://jsfiddle.net/YpX3B/ – jatrim

0

不,你將需要重寫它是這樣。 y是該對象的一個​​屬性,不能在沒有對象的情況下訪問它 - 與從閉包訪問變量(例如,在重寫中訪問變量時不同)。

當然,當你調用函數爲x.z(),該this keyword將指向對象了,所以你只要能寫爲

return this.y + " zed"; 

總是調用上下文中的功能該對象。

0

@VisioN有直接的答案。這可能有助於想象爲什麼這是必要的,如果你重寫代碼這樣:

var x = {}; 
x.y = "why"; 
x.z = function() {return this.y + " zed"; }; 
alert(x.z()); 

這裏y和z是一個對象的屬性,但沒有功能性關閉範圍界定。您需要使用「this」關鍵字來訪問父對象的屬性。

或者,

var x = function() { 
    var y = "why";  
    var z = function() { return y + " zed?"; };  
    return z(); 
}; 
alert(x()); 

這通過訪問ý不使用這個演示功能作用域。在x裏面,y是已知的。外面,它不是。

0

使用揭示模塊的模式:

var x = (function() { 
     y = "why"; 
     z = function() { 
      return y + " zed"; 
     }; 
     return { 
      "y": y, 
      "z": z 
     }; 
    })(); 

    //now you can call: 
    x.y // "why" 
    x.z() // "why zed"