2017-02-20 155 views
2

这里是我做了测试的例子:是一个全局范围的函数内的JavaScript函数?

function f1(var1){ 
    alert('f1 called'); 
    function f2(var2){ 
    alert('f2 called'); 

    } 
    this.data='something else'; 
    this.f2 = f2; 
} 
f1.data='something'; 
f1.f3 = function(var3){ 
    alert('f3 called'); 
} 
console.log(f1); //shows the function 
console.log(f1.data); //can have properties attached - cool 
console.log(f1.f2(2)); //error: "f1.f2" is not a function 
console.log(f1.f3(3)); //this works as expected 

看来,F1里面的功能f2在范围上本地。是否有任何等效的方法来调用这样的函数内的函数?

+1

其分配是这样的: 'this.f2 = function(){// ...'! –

+3

您需要将其暴露给全局范围,例如,使用任何一种JS模块模式。但是,在本地确定一个功能的关键在于*避免*污染全球范围。你最终的目标是什么? –

+4

@ibrahimmahrir \t ...这就是'this.f2 = f2'所能做的;没有区别。 –

回答

7

不幸的是,this必然的window全球范围内,因为你还没有使用实例new f1();

var f = new f1(); 
f.f2(); // Now works 
0

取决于你想达到什么样的一个实例f1,有一对夫妇的模式你可以用来访问f1以外的f2功能。您可以使用new实例化一个f1对象:

function f1() { 
    this.f2 = function() { console.log('f2'); } 
} 

new f1().f2() //logs 'f2' 

或者你也可以从功能f1返回功能f2

function f1() { 
    return function f2() { console.log('f2'); } 
} 

f1()() //logs 'f2' 
0

变化代码:

function f1 (var1){ 
    alert('f1 called');   
}; 
f1.data='something else'; 
f1.f2 = function f2(var2){ 
    alert('f2 called'); 
};