2015-09-29 40 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