JavaScript:作为函数/方法调用

时间:2014-03-04 12:22:32

标签: javascript invocation

我正在努力提高我的JavaScript技能,并且我知道调用函数有四种基本方法 - 它改变了this的定义方式。我感兴趣的两个是基本的两个:

  • 调用功能
  • 作为方法
  • 的调用

哪个好。第一个,this将引用window对象:

function doSomething() {
    console.log(this);
}

doSomething(); // window is logged

第二个this将引用它正在执行的对象:

var t = {
    doSomething: function () {
        console.log(this);
    }
};

t.doSomething(); // t is logged

哪都好。但是,在这两个调用方法中,this总是会返回包含方法的对象(如果有意义的话),这是正确的吗?

在第一个示例中,doSomething()实际上是在window对象中定义的 - 所以window对象的属性也是如此,即使我们没有定义它(或者参考它。)

因此,难道不能说,实际上,作为一个函数的调用是一种调用方法吗?或者不是?

1 个答案:

答案 0 :(得分:0)

想象一下定义你的函数,不是像你那样在全局对象的范围内,而是在另一个函数的范围内:

function outer() {
    var inner = function(){console.log(this)};
    inner();
};
outer();

您认为这个将被绑定到什么地方?会打印什么?

您可能认为它将是外部函数对象,但事实证明它始终是全局对象。

就像你写的那样:

function outer() {
    var inner = function(){console.log(this)};
    inner.call(window);
};
outer();

这是一个非常危险且远非直观的JS“功能”。

所以,回到你的第一个例子,你所做的基本上是这样的:

doSomething = function () {
    console.log(this);
}
doSomething().call(window);

而且,就像Yoshi指出的那样,如果你使用ES5的严格模式,你最终会做出类似的事情,在我看来,这样做的危险性要小得多:

  

doSomething的()调用(未定义);

它还为您提供了一个强烈暗示,即您不应该在函数中使用 this 这一事实;)