这个内部嵌套函数
this inside nested function
到目前为止,为了清楚理解,我认为这总是指函数的所有者。
我主要考虑了三个案例。
- 实例
- 方法,这是调用该方法的实例。
- 事件处理程序,元素是调用事件的函数的所有者。
- 全局命名空间中的函数,窗口是函数的所有者
但是当我创建一个内部函数并在那里调用该函数时会发生什么。即使在这种情况下,这也是指窗口。
function outer(){
var inner = (function(){
console.log(this);
})
inner();
}
outer();
谁能解释为什么这指的是简单的窗口。
您正在用 OO 术语思考,但您发布的代码不是 OO。正如 Rob W 在他的帖子中所说,默认this
在严格模式下window
或undefined
。
this
仅在特定函数或情况上下文中为其提供值时更改值。
在类模拟中使用函数的地方,即实例化(通过new
)而不是简单地调用,this
如您所期望的那样指向实例。
function Dog(name) {
this.name = name;
alert(name);
}
var fido = new Dog('Fido'); //alerts 'Fido'
为this
提供上下文的其他情况包括事件处理程序(至少在addEventListener
模型中,而不是较旧的 IE 中),以及任何时候使用 call()
或 apply()
并自行手动设置this
上下文。
另外,不要认为this
指向JavaScript中的函数"owner"。在一个事件中,this
指向受影响的元素,但将该元素视为"拥有"回调函数是没有帮助的 - 它只是在该元素的上下文中运行。
最后,正如昆汀所提到的,没有办法引用this
的外部语境。您必须先将其缓存在变量中。
function Dog() {
var that = this;
setTimeout(function() {
alert(this); //window - setTimeout() has overwritten the 'this' context
alert(that); //we reference our cached, outer context
}, 500);
}
var fido = new Dog('Fido');
this
(在没有new
、bind
、call
、apply
或箭头函数魔术的情况下)是指调用函数的对象。
如果没有对象,则使用默认对象。对于 Web 浏览器,该对象是window
的(严格模式下除外)。
// all comments apply to "inside the body of the bar function"
foo.bar(); // this is foo
foo.baz.bar(); // this is baz
bar(); // this is window
您可以将 this
的值复制到要调用的函数作用域中存在的另一个变量。
function outer(){
var that = this;
var inner = (function(){
console.log(that);
})
inner();
}
outer();
。您可以使用各种方法更改this
的值。
function outer(){
var inner = (function(){
console.log(this);
})
inner.apply(this);
}
outer();
相关文章:
- 用嵌套函数和默认函数定义函数
- d3中堆栈函数和嵌套函数之间的差异
- JavaScript 中的嵌套函数和 “this” 关键字
- 嵌套到另一个函数中的Fancybox函数;不起作用
- Javascript中带有返回值的嵌套函数
- 访问嵌套函数结构中的JavaScript父函数变量
- 从嵌套函数访问函数属性
- 如何在javascript中使用嵌套函数作为生成器(使用“inner”yields)
- Javascript嵌套函数属性继承
- 具有嵌套对象数组的 Javascript 对象的递归搜索函数
- Facebook Javascript 函数嵌套循环
- 将动态 AJAX 函数嵌套在 JavaScript 函数中 - 并保持更新
- 对由多个groupBy函数嵌套的对象数组进行分组
- 从父函数返回什么以获取从子函数/嵌套函数返回的值
- jQuery匿名函数-嵌套函数
- ajax调用函数嵌套
- 函数嵌套括号的Python风格指南是什么?
- setTimeout函数中的关键字,该函数嵌套在on()方法下.但这并没有奏效
- 嵌套异步函数嵌套同步函数
- 如何克服函数嵌套