我不明白为什么“this”关键字不能像我期望的那样工作

时间:2012-03-20 20:32:22

标签: javascript this

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

5 个答案:

答案 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)

javascript中的

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.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); 
}