在javascript中调用最内部函数的最佳方法

在javascript中调用最内部函数的最佳方法,javascript,Javascript,从上面的示例调用嵌套函数f1是否正确?我假设您希望f1成为f的一种方法,在这种情况下,您需要将其作为属性添加(就像您为m所做的那样): 然后可以在f的实例上调用该方法: var f = function() { this.m = '10'; this.f1 = function(){ alert(this.m); //Notice that this has changed to `this.m` }; }; //Function expressions sho

从上面的示例调用嵌套函数f1是否正确?我假设您希望
f1
成为
f
的一种方法,在这种情况下,您需要将其作为属性添加(就像您为
m
所做的那样):

然后可以在
f
的实例上调用该方法:

var f = function() {
   this.m = '10'; 
   this.f1 = function(){
       alert(this.m); //Notice that this has changed to `this.m`
   };
}; //Function expressions should be terminated with a semicolon
这是一个例子

当前使用它的方式将导致
f1
泄漏到全局范围(因为它是在没有
var
语句的情况下声明的)


旁注:通常更倾向于使您的方法成为
原型的属性。这将在内存中生成函数的单个副本,而不是每个实例的副本:

o = new f();
o.f1(); //Alerts '10'

在代码中,函数是一个内部函数,不能从外部调用。如果在构造函数内调用,则必须将f1指定给对象:

var f = function() {
   this.m = '10';
};

f.prototype.f1 = function() {
    alert(this.m);  
};
然后你可以打电话:

this.f1 = function() {
  alert(m);
}

这个.f1=function(){}和f1=function(){}之间有什么区别;使用this.function,可以将该函数添加到对象的公共可用函数中。使用函数f1,您可以定义对象的内部函数,该函数可在对象内部使用,但不能从外部使用。@PraveenDsouza看一看上面的讨论,我认为连同答案,它很好地显示了不同的作业和您的作业是如何工作的。我同意您所说的大部分内容,但是,在另一个函数中定义函数functionName(){…}的函数不会将其泄漏到全局范围。它位于另一个函数的范围内。函数i(){function o(){return'local'}};o()/=>error@BeatRichartz-这是一个函数声明,其作用域将限定于声明它的上下文。在问题中,虽然它是一个函数表达式。
f1
变量泄漏到全局范围。赋值发生在适当的位置,但函数一旦被赋值到
f1
,就可以从该范围之外访问。您的解释很有道理,是的,我确实忽略了函数被赋值到未声明变量的事实。但本质上还是一样的,函数内部的变量不会泄漏到外部:函数i(){o=function(){return'local'};o()/=>错误。是的,像这样声明变量是不好的做法。@BeatRichartz-变量将泄漏到全局范围。您的示例引发错误的原因是
o
不是函数,因为您没有调用
i
。作业在适当的地方进行。但是变量本身是可以访问的。@BeatRichartz-不客气:)范围和提升的复杂性有时会令人困惑!
this.f1 = function() {
  alert(m);
}
o = new f()
o.f1() //=> alerts 10