& # 39;这个# 39;匿名闭包函数内部
'this' inside of anonymous closure functions
(function(value) {
this.value = value;
$('.some-elements').each(function(elt){
elt.innerHTML = this.value; // possibly undefined (Why?)
});
})(2);
有人能解释一下上面代码中'this'的值吗?
我的理解:
this.value = value // Line 2
-这里指的是全局对象elt.innerHTML = this.value; // line 4
-为什么这个"可能"没有定义。请解释。
编辑:顺便说一句,我已经彻底阅读了这篇文章中"this"的解释(如何"this";关键词工作?)post
作为回调函数发送到.each()方法中,this
指的是DOM元素(对于这个集合中包装在jQuery对象中的每个元素),而不是window
:
更重要的是,回调是在当前对象的上下文中触发的元素,因此关键字
this
指的是该元素。
(BTW,这使得elt
arg;至少,这有点不清楚为什么你使用this
和elt
指代相同的东西)。
然而,并不是所有的DOM元素都有value
属性定义:事务,它仅为元素的子集设置:input
, select
, textarea
, option
等。这可能就是为什么你得到undefined
作为结果的原因。
您可以通过使用jQuery.proxy()方法轻松地进行调整:
$('.some-elements').each($.proxy(function(elt){
elt.innerHTML = this.value;
}, this));
现在发送到.each()
的函数使用外部的this
作为其上下文(显然,它不再像elt
那样指向DOM Element)。
JS解释器用来确定this
的基本算法如下:
- 当一个函数通过
call
和apply
方法被调用时,this
是call
或apply
的第一个参数。 - 当一个函数被通过
bind
方法创建的绑定函数调用时,this
是bind
的this值参数。 - 当一个函数作为一个方法被调用时(
obj.method(params)
),那么this
就是这个方法被获取的对象,在这个例子中是obj
。 - 在非严格模式下,
this
为全局对象;在非严格模式下,null
为全局对象。
由于each
使用(1)中的特殊方法将容器作为this
传递,因此内部函数中的this
应该是$('.some-elements')
的结果,即一个jquery封装的DOM节点数组。
第4行,this.value
指的是$('.some-elements')
的"each"实例。在任何函数内部,它都指向该函数正在操作的对象。在匿名函数的情况下,它是全局作用域。
- 调用函数内部的函数
- javascript函数内部的代码用逗号而不是分号分隔
- javascript无法重新定义函数内部的全局对象
- 如何从函数内部的这个变量中获取值
- appendChild在函数外部工作,但在函数内部不工作
- 在jquery函数内部设置来自jquery函数的var;t运行
- 一个'var'在函数内部声明
- 为什么(如何)'这'从函数内部调用回调时发生更改
- 函数内部未定义的输入值
- 在Meteor中如何将数据从函数内部复制到其他模板
- 如果在构造函数内部为else,则Javascript是可选的
- 我对“;返回true"嵌套函数内部;t工作
- jQuery 无法使用 AJAX 调用访问函数内部的函数参数
- javascript,将参数传递给函数内部的闭包中的回调
- 匿名自执行js函数内部的全局变量在外部仍然可用
- 使用PHP和Javascript在函数内部传递alphaneumeric值作为参数时出错
- 访问函数内部的Polymer方法
- 更改函数内部的全局变量而不调用它
- 如何在函数内部为jquery工具提示调用不同的var字符串
- 构造函数内部的事件处理