【问题标题】:What is the context of an anonymous function?匿名函数的上下文是什么?
【发布时间】:2011-07-22 21:54:19
【问题描述】:

我有这样的代码:

function demo() {
    this.val=5;
    function() {
        this.val=7;
    }();
}

现在,当我在 firefox 或 chrome 控制台中执行此代码时,它会出现语法错误。我不明白为什么这是一个错误,因为我已经读过 javascript 函数是对象,所以当我调用匿名函数时,其中的 this 指向函数演示,应该将 val 更改为 7,所以如果我愿意

var x=new demo();
x.val;   //should give 7

但是当我这样做时

function demo() {
    this.val=5;
    var f=function() {
            this.val=7;
    }();
}
window.val;    // gives 7

我不明白函数是否是对象,那么为什么匿名函数中的this 指向window 而不是demo。 请解释一下。

【问题讨论】:

  • 这就是它的工作方式。如果您“正常”调用函数,this 关键字将指向全局对象...
  • @Šime Vidas 这里的“通常”是什么?函数不是对象吗?
  • "normally" = 通过将括号附加到函数名称,例如:foo()。调用函数的其他方式是(1)像构造函数和(2)通过call/apply。在这些情况下,this 关键字的规则是不同的。是的,函数就是对象。

标签: javascript this anonymous-function


【解决方案1】:

我不明白为什么这是一个错误

因为

function() {
    this.val=7;
}();

被评估为函数声明,并且函数声明需要一个名称。要将其解释为函数表达式,您需要将其放在括号中:

 (function() {
    this.val=7;
 }());

(使其成为立即函数)

或将函数分配给变量:

var f = function() {....};
f();

您在第二个 sn-p 中所做的是两者的混合,虽然有效,但没有多大意义。 f 的值为 undefined

我不明白函数是否是对象,那么为什么匿名函数中的 this 指向 window 而不是 demo

函数不继承调用它们的上下文。每个函数都有自己的thisthis 所指的内容由如何函数调用决定。基本上可以归结为:

  • “独立”(func())或作为即时函数((function(){...}())):this 将引用全局对象(浏览器中的window

  • 作为对象的属性 (obj.func()):this 将引用 obj

  • 使用 new [docs] 关键字 (new Func()):this 指的是继承自 Func.prototype 的空对象

  • apply [docs]call [docs] 方法(func.apply(someObj)):this 指的是someObj


进一步阅读:

【讨论】:

  • 我可能是错的,但我认为(function() { this.val=7; }()); 的括号有点偏离() 不是在结束) 之后出现吗?
  • @Felix Kling 函数的this 指向什么?你能详细说明一下吗?
  • @kingjiv:其实这并不重要。但是 JSLint 更喜欢里面的“调用”括号。
  • @lovesh:我以为我提供了足够的信息。正如我所说,这取决于函数的调用方式。什么不清楚?
  • 很高兴知道。猜猜我只是假设通常是这样看的。
【解决方案2】:

你可以像这样做你所描述的:

function demo() {
    var self=this;

    this.val = 5;

    var f = (function() {
        self.val = 7;
    })();
}

【讨论】:

  • 我知道如果我想改变 val 我可以这样做,但我的全部问题是如果函数是对象那么为什么 this 不指向函数,在我的情况下(demo
  • @king 此代码具有误导性。内部函数是一个 IIFE,因此分配给变量f 的值是undefined,而不是函数对象本身。 IIFE 应该用括号括起来。
  • 它只是在该函数内部定义的一个对象,它并不是您调用new demo() 时创建的对象的一部分。如果您要将其更改为this.f = function(),然后调用this.f(),则会以this 作为对象来调用它。
  • @lovesh 为什么函数是对象这一事实会导致this 指向函数本身的结论?这两件事是无关的......
  • @love 好吧,如果你在印度,那么你现在绝对应该去睡觉了(因为在你这里是凌晨 4 点):)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多