2012-03-20 179 views
3

我想要做的是在满足指定条件时执行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); } 
+0

如果您有时间,[this](http://jibbering.com/faq/notes/closures/)是一个非常全面的解释。 – Andrew 2012-03-20 20:40:31

回答

1

thiswindow时调用这样。

要获得其this作为body元素,把它像这样...

document.body.crea_li = create_tag.call(document.body, name); 
0

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(...) } 
0

this所指到函数的父项,但其父项实际上是window对象,而不是document对象或document.bodythis实际上指的是函数调用的上下文,在我看来,您应该避免使用它来调用方法只是因为这个原因,因为它很难看到什么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); 
} 
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 
1

无处在你的代码create_tag分配作为document.body的方法。最接近的是document.body.crea_li=create_tag(name);,但实际发生的情况是,您正在执行create_tag作为全局对象的成员,并将该操作的结果分配给document.body.crea_li

+0

是的,有问题。我想如果它实际上被分配为一个方法,那么“this”关键字应该按照预期工作。那么我怎样才能简单地将它作为解决问题的方法?因为我试图在被调用时插入函数,而不是将其链接回外部函数,但似乎也没有工作。 – BigCola 2012-03-20 20:46:45

相关问题