在javascript中调用最内部函数的最佳方法
从上面的示例调用嵌套函数f1是否正确?我假设您希望在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
成为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