我没有'我不明白为什么;这个“;关键字dons'I don’我没有预料到的那么管用
I don't understand why the "this" keyword doesn't work as I expect
我想做的是在满足指定条件时执行create_tag函数。我将此函数称为对象的方法,在本例中为document.body,通过将外部函数"create_tag(..)"设置为其方法。问题是在该函数内部,我有一个"this"关键字,我希望它指代该方法的父级document.body.相反,它似乎不起作用。我尝试将函数中的"this"替换为"document.body",因此问题应该是由"this"引起的
这是代码:
xmlDom=xmlhttp.responseXML;
hint_ul=document.getElementById("hint_ul");
personaggi=xmlDom.documentElement.getElementsByTagName("personaggio");
for(i=0;i<personaggi.length;i++){
personaggio=personaggi.item(i);
name=personaggio.childNodes[1].firstChild.nodeValue;
if(name.substr(0, str.length).toLowerCase()==str.toLowerCase()){
document.body.crea_li=create_tag(name);
}
}
}
function create_tag(inner){
a=document.createElement("a");
a.innerHTML=inner;
this.appendChild(a); }
this
将为window
。
要将其this
作为body
元素,请这样调用它…
document.body.crea_li = create_tag.call(document.body, name);
在您的代码中,create_tag
没有被指定为document.body
的方法。最接近的是document.body.crea_li=create_tag(name);
行,但这里实际发生的是,您作为全局对象的成员执行create_tag
,并且该操作的结果被分配给document.body.crea_li
。
您可以在函数体之外引用this
,稍后在范围内引用它:
var self = this;
function create_tag(inner){
a=document.createElement("a");
a.innerHTML=inner;
self.appendChild(a);
}
这可能是个不错的把戏。当我制作涉及许多对象和函数的复杂javascript对象时,在我创建的对象的顶部:
var self = this;
由于这将存在于范围内,所以根对象始终是可访问的。
以下是我将如何实现的一个工作示例:
SomeReallyComplexThing = function() {
var self = this;
var foo = 'bar'
this.fooThing = 'Other thing'
this.setSomeData = function(){
console.log('Some data set', arguments)
}
this.makeMassiveCall = function() {
var completeFunc = function(){};
var url = '/some/endpoint.json';
var requestData = {};
jQuery.get(url, requestData, function(data) {
/*
* Data has come back
*/
self.setSomeData(data)
completeFunc(data);
});
}
}
//outside the scope
s = new SomeReallyComplexThing()
s.fooThing() //visible
s.self //undefined
this
是一个了不起的家伙。其思想是this
指的是当前的函数上下文。
这意味着当函数this
中的运行代码引用该函数的上下文时,该上下文没有appendChild
方法。
通常,您使用闭包来保持对调用上下文的引用,类似于以下
var _self = this;
var result = func();
function func()
{
// _self is the calling context, this is the current context
}
或者,您可以传递一个对调用上下文的引用:
document.body.crea_li=create_tag(name,this);
function create_tag(inner, context) { context.body.appendChild(...) }
this
指的是函数的父对象,但它的父对象实际上是window
对象,而不是document
对象或document.body
。this
实际上指的是从任何上下文调用函数的地方,在我看来,出于这个原因,你应该避免使用它来调用方法,因为很难看出this
实际指的是什么。例如,如果你从另一个函数使用this
调用函数,它会指代该函数中的上下文。
这个例子可能有助于展示正在发生的事情:
var hello = function() {
alert( this.message );
}
window.message = "hello!";
hello()
您可以像之前建议的那样直接在代码中document.body
,也可以传递另一个参数,该参数告诉函数将创建的标签附加到何处:
function create_tag(inner, elementToAddTag){
a=document.createElement("a");
a.innerHTML=inner;
elementToAddTagTo.appendChild(a);
}
- 为什么delete关键字的作用与预期相反
- 为什么$scope和'这'关键字在控制器内部可互换使用
- 为什么在构造函数函数中使用此关键字
- 为什么import关键字有用
- 为什么在JSON中需要exclusiveMinimum和exclusiveMaximum关键字
- 为什么在没有 var 关键字的情况下分配给变量时会出现引用错误
- JavaScript:古代代码使用“new”关键字启动简单对象.为什么
- 为什么 JavaScript 函数需要有关键字“async”?“等待”关键字还不够吗?
- 为什么无法使用 const 关键字分配 JavaScript 对象的常量属性
- RegExp / Jquery / Isotope 按关键字搜索和过滤:不使用某些关键字组合,为什么
- Javascript:为什么有些变量在( )中,有些变量在关键字之前
- 为什么这个关键字不是指独立JS函数中的窗口
- 为什么数学对象在javascript中不需要新关键字
- 我没有'我不明白为什么;这个“;关键字dons'I don’我没有预料到的那么管用
- 为什么我们需要“;新的“;关键字
- 我的用户脚本没有'我不工作;我不知道为什么(过度使用var关键字)
- 为什么实例没有't在没有prototype关键字的情况下继承添加到构造函数的属性
- 为什么不是在 JavaScript 中匿名函数之外访问“this”对象的关键字
- 为什么函数在构造函数中声明时不使用new关键字
- 为什么需要在此函数中计算“this”关键字