调用函数和创建函数实例之间的Javascript区别

Haz*_*ama 14 javascript

我试图理解为什么内部函数可以在直接调用外部函数时访问外部函数的公共属性,而不是在将其赋值给变量时?

例:

function outer(x,y){

    this.x = x;
    this.y = y;

    function inner(){
        alert(this.x);       
    }

    inner();
}

outer(1,2); //As expected, alerts 1
var func = outer(1,2) //Also alert 1
var func2 = new outer(1,2); //Alerts undefined
Run Code Online (Sandbox Code Playgroud)

我试过的一件事是删除this关键字alert(this.x);,它确实适用于所有三种情况.但是,如果我删除this关键字,我将访问传入的参数,而不是公共变量,这绝对不是所需的操作.有人可以解释这种行为吗?

Poi*_*nty 19

当你这样调用时outer(1, 2),this是一个引用window,所以"x"和"y"实际上是全局变量.这就是为什么inner()可以访问"x".

当你打电话时,new outer(1, 2)你已经this(在"外部")引用了一个新对象.当"内部"被称为"外部"时,this仍将引用window,因此没有"x".

this每个函数调用确定值,该值仅取决于该调用的详细信息.因此,你调用"外部"通过这一事实new对内部调用"内部"没有影响 - 因为你只是将函数调用为inner();,this函数内部的值将是一个引用window(嗯,全局上下文,无论如何)是).

以下是this调用函数时可以设置的方法:

  1. 如果通过new运算符调用该函数,this则将引用新创建的对象.
  2. 如果通过对象(foo.someFunction())的属性查找获得对函数的引用,那么this将是对该对象的引用.
  3. 如果该功能通过被称为.call().apply()在功能原型,然后this将指的第一个参数取其这些功能被用于,如果需要强制转换的对象的值.
  4. 如果通过简单的"裸"引用调用该函数,this则将引用全局上下文(window在浏览器中).编辑 -森那维达斯在严格模式上面评论指出,这种情况下会导致thisnull(这真让人有点更有意义,而且会避免在OP观察到的古怪).


Mar*_*rst 7

有四种方法可以在Javascript中使用一个函数,每个函数都改变了以下内容this:

  • 函数调用:this =全局对象(浏览器中的窗口)
  • 方法调用:this =从中调用它的对象.
  • 构造函数调用:this =您正在创建的新对象.
  • 呼叫/应用呼叫:此=您传递的对象.

在您this == window直接调用函数的情况下(outer())但是如果使用new(new outer())调用,则它将是您正在创建的新对象.

基本上我在这里写的