我不明白为什么“this”关键字不起作用,因为我期望
我想要做的是在满足指定条件时执行create_tag函数。我将这个函数称为一个对象的方法,在这个例子中是document.body,通过设置一个外部函数“create_tag(..)”作为它的方法。问题出在这个函数里面,我有一个“this”关键字,我期望引用该方法的父类document.body。相反,它似乎并不奏效。我试图用函数中的“document.body”替换“this”,所以问题应该由“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); }
this
将window
时调用这样。
要获得其this
作为body
元素,把它像这样...
document.body.crea_li = create_tag.call(document.body, name);
this
在JavaScript是一种sqirrely研究员。这个想法是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);
}
你可以做一个参考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
无处在你的代码create_tag
分配作为document.body
的方法。最接近的是document.body.crea_li=create_tag(name);
,但实际发生的情况是,您正在执行create_tag
作为全局对象的成员,并将该操作的结果分配给document.body.crea_li
。
是的,有问题。我想如果它实际上被分配为一个方法,那么“this”关键字应该按照预期工作。那么我怎样才能简单地将它作为解决问题的方法?因为我试图在被调用时插入函数,而不是将其链接回外部函数,但似乎也没有工作。 – BigCola 2012-03-20 20:46:45
如果您有时间,[this](http://jibbering.com/faq/notes/closures/)是一个非常全面的解释。 – Andrew 2012-03-20 20:40:31