Как перевести область видимости this в вызов функции в javascript - PullRequest
2 голосов
/ 19 декабря 2011

Как переслать ссылку на область действия this на элемент, вызывающий прослушиватель событий?

Пример:

<input type=button value="Foo" id=mybutton>

addEvent('mybutton','touchstart', function(){
    if(window['touchmoved']==false)
    hover(); 
});


function hover(){
    this.value //undefined
}

Ответы [ 3 ]

7 голосов
/ 19 декабря 2011

Используйте методы JavaScript Function.call или Function.apply:

addEvent('mybutton','touchstart', function(){
    if(window['touchmoved']==false)
        hover.call(this); // `this` of the called hover points to this `this`
});
3 голосов
/ 19 декабря 2011

Используйте fn.call() или fn.apply(), чтобы установить желаемое значение this.См. Ссылки для , звоните или , применяйте в MDN.

addEvent('mybutton','touchstart', function(){
    if(window['touchmoved']==false) {
        hover.call(this); 
    }
});

И .call(), и .apply() позволяют указать, что вы хотите, указатель thisбыть в вызываемой функции.

.call() позволяет вам передавать конкретные дополнительные аргументы, которые вы хотите, чтобы вызываемая функция получала следующим образом:

fn.call(this, true, "foo")`

.apply() используется, когда аргументы, которые вы хотите передать вызываемомуФункция находится в массиве, и вы просто передаете массив аргументов следующим образом:

var args = [true, "foo"];
fn.apply(this, args);

.apply() часто используется со встроенным объектом аргументов для передачи существующих аргументов вызываемой функции (хотяЕсть и другие причины, чтобы использовать его тоже):

fn.apply(this, arguments);
0 голосов
/ 19 декабря 2011

Вы можете использовать метод function.Call () в вашем методе hover (), который вызовет метод hover.

Первый параметр метода Call является значением, которое должно быть присвоено этому в вызывающем методе.

например:

addEvent('mybutton','touchstart', function(){
if(window['touchmoved']==false)
{

}
    hover.call(this); 
});


function hover(){
    //this = touchstart event
}
...