2013-05-20 98 views
0

我正在嘗試設置如下功能。從外部函數訪問屬性

function Class() { 
} 

Class.prototype.func = function(f) { 
    var hello = "hello"; 
    setTimeout(f, 1000); 
}; 

new Class().func(function() { 
    alert(hello); 
}); 

我希望f()函數能夠訪問hello變量。問題是f()未在func()函數的上下文中運行。

我試過使用var hello = "hello";this.hello = "hello";,但都沒有工作。

如何才能f()訪問hello

+0

你需要傳遞一個參數。 – SLaks

回答

0

鑑於代碼的結構,沒有辦法讓任何「f」傳入「func」來訪問「hello」。

你可以然而,做到這一點:

Class.prototype.func=function(f){ 
    this.hello="hello"; 
    setTimeout(f.bind(this),1000); 
}; 
new Class().func(function(){ 
    alert(this.hello); 
}); 

JavaScript的作用域是基於功能(聲明上下文)之間的詞彙關係。聲明爲var的變量可用於聲明它的函數以及該函數中聲明/實例化的所有函數。在你的情況下,匿名函數是而不是在「func」中聲明,所以沒有「func」的局部變量永遠不可見。沒有辦法從「func」中動態地暴露本地範圍。 (我一般 忘記回答類似這樣的問題,當即將 忽略eval(),但在這裏我不認爲甚至可能eval()解決的情況。)

+0

完美:D將標記爲答案,當我可以。我從來不知道「綁定」方法。 – Bob

+1

@Bob新的瀏覽器中提供了「綁定」方法,您可以找到一些[適用於舊版瀏覽器的解決方法](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind)在MDN網站上。 – Pointy

0

它不能。該變量根本不存在於定義函數的範圍中。

您需要將其展示給更廣泛的範圍(例如,將其作爲Class對象或全局實例的屬性)。

1

把它作爲一個參數

function Class(){ 
} 
Class.prototype.func=function(f){ 
    var hello="hello"; 
    setTimeout(function(){ 
     f(hello) 
    },1000); 
}; 
new Class().func(function(hello){ 
    alert(hello); 
});