匿名函数的上下文是什么?

时间:2011-07-22 21:54:19

标签: javascript this anonymous-function

我有这样的代码:

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

现在,当我在firefox或chrome控制台中执行此代码时,会出现语法错误。我不明白为什么这是一个错误,因为我已经读过javascript函数是对象所以当我调用匿名函数时,它内部this指向函数demo并且应该将val更改为{{ 1}},所以如果我这样做

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。 请解释一下。

2 个答案:

答案 0 :(得分:15)

  

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

因为

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

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

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

(使其成为一项直接的功能)

或将函数分配给变量:

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

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

  

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

函数不会继承它们被调用的上下文。每个函数都有它自己的this,而this所指的是由如何调用函数决定的。它基本归结为:

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

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

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

  • apply [docs]call [docs]方法(func.apply(someObj)):this引用someObj


进一步阅读:

答案 1 :(得分:0)

您可以按照以下描述进行操作:

function demo() {
    var self=this;

    this.val = 5;

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