`这个`in嵌套函数是全局对象
`This` in nested function is global object
有人能解释一下这背后的概念吗?
假设我们有一个函数作为对象的方法:
var myobj = {
myfunc : function () {
console.log(this); // Logs reference to myobj.
}
};
myobj.myfunc();
而同一函数myfunc
内的嵌套函数将返回对头对象(窗口)的引用:
var myobj = {
myfunc : function () {
( function (){
console.log(this); // Logs reference to head window object.
})();
}
};
myobj.myfunc();
这真的让我很困惑,因为我认为函数总是会返回对父对象的引用。
问题是,这是一个固定的规则吗?也就是说,任何嵌套函数都会重新引用window
?
函数内this
的值取决于它的调用方式,而不是如何定义
当您调用myobj
范围内的函数时,myobj
将是this
的值
myobj.myfunc();
当您调用一个没有执行上下文的函数时,this的值将是全局对象,在本例中为window
。
function test() {
console.log(this); // window
}
test(); // global context
创建IIFE时,执行上下文是窗口,因为没有设置其他上下文
( function (){
console.log(this); // window
})();
然后是apply
、call
和bind
,它们可以让您为被调用的函数设置另一个值this
。
我担心正确的答案如下(经过2个小时的搜索),这本书《JavaScript简洁》指出:
你可能想知道当它在包含在另一个函数内部的函数。坏消息在ECMA 3中,这会迷失方向,并指向头部对象(浏览器中的窗口对象),而不是函数已定义。
它还指出:
好消息是,这将在ECMAScript 5中得到修复。现在,你应该意识到这种困境,尤其是当你开始路过时函数作为其他函数的值。
所以简单地说,答案是YES,任何嵌套函数都将始终返回head对象作为引用。
此外,您还可以使用变通方法来解决此问题,方法是在this
可用时立即存储其值,如下所示:
var myObject = {
myProperty: 'I can see the light',
myMethod : function() {
var that = this; // Store a reference to this (i.e. myObject) in myMethod scope.
var helperFunction = function() { // Child function. // Logs 'I can see the light' via scope chain because that = this.
console.log(that.myProperty); // Logs 'I can see the light'.
console.log(this); // Logs window object, if we don't use "that".
}();
}
};
myObject.myMethod(); // Invoke myMethod.
相关文章:
- 全局变量和全局对象的属性之间有什么区别吗
- javascript无法重新定义函数内部的全局对象
- Javascript,从静态函数中打印全局对象
- 为什么“this”指的是全局对象
- Do let语句在全局对象上创建属性
- underscore.js,名为“”的全局对象;出口;和livefyre javascript API-集成冲突
- 为什么“this”指的是对象“obj”而不是全局对象
- 从函数调用全局对象的方法
- 谷歌分析的全局对象
- AngularJS:避免使用“angular”全局对象
- Javascript Web Worker 修改全局对象
- 想要在回调中更新对象,给出正确的日志,但全局对象未更新
- 让函数中的接收器默认为全局对象背后的基本原理是什么?
- 蜘蛛猴:如何删除全局对象
- 为什么函数在全局对象中不可用
- 访问请求会在全局对象中生成
- 全局对象问题
- React Native 中全局对象的模式
- Expressjs - 全局对象
- 是否可以在 Javascript 中更改或删除全局对象的属性