我没有'我不明白为什么;这个“;关键字dons'I don’我没有预料到的那么管用

I don't understand why the "this" keyword doesn't work as I expect

本文关键字:关键字 为什么 明白 这个 dons don      更新时间:2023-09-26

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

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