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

lov*_*esh 6 javascript this anonymous-function

我有这样的代码:

function demo() {
    this.val=5;
    function() {
        this.val=7;
    }();
}
Run Code Online (Sandbox Code Playgroud)

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

var x=new demo();
x.val;   //should give 7
Run Code Online (Sandbox Code Playgroud)

但是当我这样做的时候

function demo() {
    this.val=5;
    var f=function() {
            this.val=7;
    }();
}
window.val;    // gives 7
Run Code Online (Sandbox Code Playgroud)

我不明白函数是否是对象然后this匿名函数指向window和不指向的原因demo.请解释一下.

Fel*_*ing 16

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

因为

function() {
    this.val=7;
}();
Run Code Online (Sandbox Code Playgroud)

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

 (function() {
    this.val=7;
 }());
Run Code Online (Sandbox Code Playgroud)

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

或将函数分配给变量:

var f = function() {....};
f();
Run Code Online (Sandbox Code Playgroud)

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

我不明白,如果函数是对象,那么为什么匿名函数中的这个指向window而不是demo.

功能不继承他们被称为上下文.每个函数都有它自己的this,什么this是指由下式确定如何调用该函数.它基本归结为:

  • "Standalone"(func())或立即函数((function(){...}())):this将引用全局对象(window在浏览器中)

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

  • 使用new [docs] keyword(new Func()):this引用从中继承的空对象Func.prototype

  • apply [docs]call [docs]方法(func.apply(someObj)):thissomeObj


进一步阅读: