我想要做的是在满足指定条件时执行create_tag函数。我将此函数称为对象的方法,在本例中为document.body,通过将外部函数“create_tag(..)”设置为其方法。问题出在这个函数里面我有一个“this”关键字我希望引用该方法的父文件document.body。相反它似乎不起作用。我尝试在函数中用“document.body”替换“this”,所以问题应该由“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); }
答案 0 :(得分:1)
this
将为window
。
要将this
作为body
元素,请将其称为......
document.body.crea_li = create_tag.call(document.body, name);
答案 1 :(得分:1)
您可以在函数体外部引用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
答案 2 :(得分:1)
您的代码中没有任何地方create_tag
被指定为document.body
的方法。你得到的最接近的是行document.body.crea_li=create_tag(name);
,但这里实际发生的是你正在执行create_tag
作为全局对象的成员,并且该操作的结果被分配给{{1} }。
答案 3 :(得分:0)
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(...) }
答案 4 :(得分:0)
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);
}