我有这样的代码:
function demo() {
this.val=5;
function() {
this.val=7;
}();
}
现在,当我在 Firefox 或 Chrome 控制台中执行此代码时,它会出现语法错误。我不明白为什么这是一个错误,因为我读过 javascript 函数是对象,所以当我调用匿名函数时,在它内部this
指向功能演示,应该更改val
to 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
。
请解释一下。
我不明白为什么这是一个错误
because
function() {
this.val=7;
}();
被评估为函数宣言函数声明需要一个名称。使其解释为函数表达,您需要将其放在括号中:
(function() {
this.val=7;
}());
(使其成为立即函数)
或将函数分配给变量:
var f = function() {....};
f();
您在第二个片段中所做的事情是两者的混合,虽然有效,但没有多大意义。f
将会有价值undefined
.
我不明白函数是否是对象那么为什么匿名函数中的 this 指向window
并不是demo
.
函数不会继承调用它们的上下文。每个函数都有它自己的this
以及什么this
指的是由how该函数被调用。它基本上可以归结为:
“独立”(func()
) 或作为立即函数 ((function(){...}())
) : this
将引用全局对象(window
在浏览器中)
作为对象的属性(obj.func()
): this
将参考obj
With the new [docs] https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/new keyword ( new Func()
): this
refers to an empty object that inherits from Func.prototype
apply [docs] https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/apply and call [docs] https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/call methods ( func.apply(someObj)
): this
refers to someObj
进一步阅读:
- MDC JavaScript 指南 - 函数 https://developer.mozilla.org/en/JavaScript/Guide/Functions
- MDC JavaScript 参考 - 函数和函数范围 https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope
- ECMAScript 5,第 13 节 - 函数定义 http://ecma262-5.com/ELS5_HTML.htm#Section_13
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)