Я не понимаю, почему ключевое слово "это" не работает, как я ожидаю - PullRequest
3 голосов
/ 21 марта 2012

Что я хочу сделать, это выполнить функцию 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); }

Ответы [ 5 ]

1 голос
/ 21 марта 2012

Нигде в вашем коде create_tag не назначен как метод document.body. Наиболее близким является строка document.body.crea_li=create_tag(name);, но здесь на самом деле происходит то, что вы выполняете create_tag как член глобального объекта, и результат этой операции присваивается document.body.crea_li.

1 голос
/ 21 марта 2012

Вы могли бы сделать ссылку на 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 голос
/ 21 марта 2012

this будет window при таком вызове.

Чтобы получить this в качестве элемента body, назовите его так ...

document.body.crea_li = create_tag.call(document.body, name);
0 голосов
/ 21 марта 2012

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); 
}
0 голосов
/ 21 марта 2012

this в javascript - очень странный человек.Идея состоит в том, что 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(...) }
...