2015-09-29 35 views
3

我需要在某處聲明變量a,並且使用javascript技術使其在f1函數中被調用的f2功能可見。但被直接調用(在f1函數之外),f2函數必須無法打印出一個。 我無法使用eval。 我無法更改f2功能。 但是我可以改變f1的功能。 這可能嗎?使javascript變量在不同功能中可見

function f1(var_name){ 
    f2(); 
} 
function f2(){ 
    console.log(a); 
} 
f1(); // must log value of the a 
f2(); // must not be able to log a 
+0

爲什麼不直接聲明全局? – Manu

+0

@Manu,那麼表示它不能記錄'a'的最後一行不會像OP聲明的那樣起作用。 – 1252748

+0

爲什麼不使用getter和setter? – jycr753

回答

5

小工作。 聲明全局並設置爲undefined。 在f1內調用f2函數之前設置值a。設置a在f2通話後未定義

var a = undefined; 
function f1(var_name){ 
    a = 'this is a '; 
    f2(); 
    a = undefined; 
} 
function f2(){ 
    console.log(a); 
} 
1

爲什麼不使用另一個全局變量? 您定義了一個全局變量a,並在函數f1中聲明瞭一個新的全局變量b = a,調用將打印b全局變量的f2函數,將gobal變量b再次設置爲NULL。

由此,b將僅在f1函數期間定義並且將具有全局變量a的值。

1

只有當f2()已經使用「this」: (在這種情況下,不會有變化來添加「this」支持)。

function f1(var_name){ 
    var scope = {a: var_name}; 
    f2.call(scope); 
} 
function f2(){ 
    console.log(this.a); 
} 

f1(123); // must log value of the a 
f2(); // must not be able to log a 

你也可以考慮函數重載。

+0

從問題:*我無法更改f2函數*。這需要改變'f2()'。 – Phylogenesis