我有这样的代码:
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
。
请解释一下。
答案 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;
})();
}