Беда с функциями (JavaScript) - PullRequest
1 голос
/ 21 декабря 2009

Я создал рабочую страницу с большим количеством JavaScript. Javascript помещается между тегами <head></head> без проблем, но я действительно хочу переместить его во внешний файл.

Хотя я мог бы просто вырезать и вставить весь код без тегов <script></script>, но включив $(document).ready(function() { }); в файл .js и ссылаться на него обычным способом, но это вызывает у меня большие головные боли. Кто-нибудь может подсказать, почему я не могу просто сделать это?

В качестве компромисса я хотел бы отключить хотя бы некоторые из своих функций и поместить их во внешний файл, но там тоже есть проблемы.

function look(){
  var word_id = $(this).attr("id");  
  //    Other stuff
  var   value = $(this).val();  
  //    Other stuff
}

$("input").focus(function(){look();});

В приведенной выше функции this - это не this , как раньше, когда код выглядел следующим образом:

$("input").focus(function(){
  var word_id = $(this).attr("id");  
  //    Other stuff
  var   value = $(this).val();  
  //    Other stuff
});

Я надеюсь, что действительно умный человек легко обнаружит мои ошибки. Большое спасибо, Патрик.

Ответы [ 3 ]

2 голосов
/ 21 декабря 2009

Когда вы вызываете функцию без заданного контекста, когда вы вызываете look(), ключевое слово this внутри этой функции будет глобальным объектом.

В вашем случае вы можете передать только ссылку на вашу функцию, и она будет работать правильно:

$("input").focus(look);

Кроме того, может быть полезно знать, что ключевое слово this не является полностью неявным и может быть задано явно с помощью функций call и apply:

function test(arg1){
  alert(this + arg1);
}

test.call('hello ', 'world'); // will alert 'hello world'

И что контекст (ключевое слово this) устанавливается неявно в следующих случаях:

1- При вызове функции, которая является членом объекта, например ::

obj.myFunc(); // 'this' will refer to obj

2- При вызове функции с оператором new:

var test = new Func(); // 'this' will refer to a new object

3- При вызове функции, не связанной с каким-либо объектом:

foo();
// or
(function () {})(); // 'this' will be the global object
2 голосов
/ 21 декабря 2009

Попробуйте использовать этот код:

$("input").focus(look);

Проблема в том, что когда функция look была обернута анонимной функцией, указатель this внутри look был засорен. Вот более точное объяснение:

$("input").focus(function() { 
    this; // Refers the DOM element jQuery is acting on
    // The _this_ pointer of the anonymous function is not passed to look.
    look(); // The _this_ pointer in look instead points to the window scope.
});

Если по какой-либо причине вам нужно обернуть вызов функции анонимной функцией, вы можете использовать apply или call, чтобы передать указатель this внешней области видимости на look. Вот быстрый пример:

$("input").focus(function() { 
    ...
    look.apply(this);
    // This works too:
    // look.call(this);
});

Методы call и apply практически идентичны. Они отличаются только тем, как они принимают параметры. Подробнее о позвоните и подайте заявку

0 голосов
/ 21 декабря 2009

Я бы посоветовал поместить ваш JS в нижний колонтитул, чтобы вы могли убедиться, что он будет загружен только после полной загрузки всего остального на странице (DOM).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...