Javascript对象内部函数的区别

时间:2010-01-10 21:35:12

标签: 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);
};

两种情况下的优点和缺点是什么?在第二个我知道可以从主函数外部调用该函数。 运行时还有区别吗? (比如时间和表现)

1 个答案:

答案 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.

您还可以使用callapply方法明确设置this关键字

function test () {
  alert(this);
}

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

现在,您的两个示例的b函数之间的差异基本上是在第一个代码段中,b函数声明,在您的第二个示例中{ {1}}是函数表达式

函数声明受hoisting约束,它们在分析时计算,函数表达式在运行时定义。

如果您想了解函数声明和函数表达式之间差异的更多细节,我会给您一些资源:

顺便说一下,你不需要semicolon after function declarations