2010-01-10 45 views
3

对象内的函数有什么不同?我有两个基本上做同样事情的例子。对象内函数的Javascript差异

function a(param) { 
    function b(input) { 
     return input%10; 
    }; 
return 'The result is ' + b(param); 
}; 

function a(param) { 
    this.b=function(input) { 
     return input%10; 
    }; 
return 'The result is ' + this.b(param); 
}; 

有什么优势,在两种情况下disadvatages?在第二个我知道,该功能可以从主函数外调用。 运行它时是否也有区别? (如时间和性能)

回答

11

第二个示例中,如果您调用不带new运算符的函数,则this关键字将引用Global对象,并且通过查看返回值,似乎您并没有试图制造一个constructor function

我想你需要知道this关键字(功能方面)是如何工作的:

this关键字隐含集时:

1 - 当一个函数被调用的方法(该函数被调用作为对象的成员):

obj.method(); // 'this' inside method will refer to obj 

2-甲正常的函数调用:

myFunction(); // 'this' inside the function will refer to the Global object 
// or 
(function() {})(); 

3-当new运算符用于:

var obj = new MyObj(); // this will refer to a newly created object. 

而且你还可以设置this关键字明确,与callapply方法:

function test() { 
    alert(this); 
} 

test.call("Hello world"); // alerts 'Hello world' 

现在,你的两个例子的b函数的区别,基本上就是在第一个代码片段中,b函数声明,在你的第二个例子中b函数表达式

函数声明受hoisting约束,并且它们在解析时被评估,函数表达式在运行时定义。

如果你想要的函数声明与函数表达式之间的区别更多的细节,我离开你一些资源:

而且顺便说一句,你不需要semicolon after function declarations