2012-06-21 78 views
1

我使用knockoutjs,這裏被簡化視圖模型:如何從嵌套函數設置變量在JavaScript

var app = function(){ 
    var self = this; 
    this.index = 0; 
    myfunction = function(){ 
     //how can i modify index here  
     self.index = 1; 
    }; 
    console.log(self.index); // i want to output 1 here , rather than 0 
}; 

new app();​ 

的感謝!

回答

1

我初始化這樣的功能:

this.myfunction = function(){ 
    self.index = 1; 
}; 

然後叫它:

var test = new app();​ 

test.myfunction(); 
console.log(test.index); 

當你初始化你的函數沒有被調用,所以裏面的代碼是不是正在執行。

在你的情況,但是,這應該是足夠了(改變你的代碼,類似於此):

myfunction(); 
console.log(self.index); // i want to output 1 here , rather than 0 
2

這是涉及到具體knockout.js,或者你只是想排序平原ECMAScript問題?任何...

通常最好不要在函數表達式中使用聲明,而構造函數應該以首字母開頭,讓別人知道它們是構造函數。

function App() { 
    var self = this; 

目前尚不清楚爲什麼要這樣做。保持對的引用,這個在構造函數中不常見。

this.index = 0; 
    myfunction = function(){ 

這裏是你陷入困境的地方。當第一次調用consructor時,上面將創建一個名爲myfunction的全局變量。那probaby不是你想要做的。函數聲明將保持本地,明確。無論如何,函數應該放在App.prototype上。

function myFunction() { 

 //how can i modify index here 
     self.index = 1; 
    }; 

該函數將修改索引屬性,但只有在調用索引屬性時纔會修改索引屬性。所以你可能做的是:

function App(){ 
    this.index = 0; // Each instance will have an index property 
} 

// All instances will share a myfunction method 
App.prototype.myfunction = function() { 
    this.index = 1; 
    console.log(this.index); 
} 

var app = new App(); 
app.myfunction(); // 1