对象中的函数之间有什么区别。我有两个基本上做同样事情的例子。
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);
};
两种情况下的优点和缺点是什么?在第二个我知道可以从主函数外部调用该函数。 运行时还有区别吗? (比如时间和表现)
答案 0 :(得分:11)
您必须小心第二个示例,如果您在没有this
运算符的情况下调用函数,new
关键字将引用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.
您还可以使用call
和apply
方法明确设置this
关键字 :
function test () {
alert(this);
}
test.call("Hello world"); // alerts 'Hello world'
现在,您的两个示例的b
函数之间的差异基本上是在第一个代码段中,b
是函数声明,在您的第二个示例中{ {1}}是函数表达式。
函数声明受hoisting约束,它们在分析时计算,函数表达式在运行时定义。
如果您想了解函数声明和函数表达式之间差异的更多细节,我会给您一些资源:
顺便说一下,你不需要semicolon after function declarations。