2013-11-08 2 views
0

У меня есть код, как это:Javascript реализация функции

(function() { 
    $(document).ready(function() { 
    //event handlers 
    $('.project-delete').on('click', function() { 
     deleteProject($(this)); 
    }); 

    $('.keyword-delete').on('click', function() { 
     deleteKeyword($(this)); 
    }); 
    this.deleteKeyword = function(model) { 
    } 
}).call(this); 

Мне интересно, если это хороший подход, так как я был недавно, и, насколько я понимаю, эта функция будет иметь глобальный масштаб обучения JS, не делает Это ? так как .call(this) передает объект окна этому закрытию, тогда я думаю, что это не лучший вариант? Есть что-то, чего я не хватает? Меняет ли .call(this) на () что-нибудь изменить?

РЕДАКТИРОВАТЬ: Так что это нормально, чтобы просто передать объект окна этому закрытию? Не лучше ли передать только пустой объект или объект jQuery?

+0

Возможно, дубликат этого вопроса: http://stackoverflow.com/questions/8035822/why-write-callthis-at-the-end-of-an-javascript-anonyms-function –

+0

Он будет явно связывать контекст закрытия к контексту родителя. То же, что и '(function() {}). Apply (this)' –

+1

Обратите внимание, что я бы определил «область» как информацию о том, к каким переменным имеет доступ функция (т. Е. Собственные локальные переменные плюс те, вложенное внутри), и это не имеет ничего общего со значением 'this'. – nnnnnn

ответ

1

Предполагая, что эта функция определена в глобальной области видимости, функция deleteKeyword будет иметь также глобальный масштаб, так как this в контексте родительской функции в основном window (который был принят в качестве this извне, в глобальном масштабе this === window).

Если вы меняете .call(this) только (), this по-прежнему window внутри функции. Это связано с тем, что при вызове функции через простой вызов функции this устанавливается на глобальный объект, который равен window.

Если вы хотите другое значение для this, вам нужно будет передать что-то еще через .call или .apply.

Для получения дополнительной информации о поведении this, посмотрите here.

1

«Насколько я понимаю, эта функция будет иметь глобальный охват, не так ли?»

«Сфера» о том, какие переменные функция имеет доступ (т.е. его собственных локальных переменных, а также местных жителей, объявленных в любых функций, которые оно может быть вложенными внутри, а также глобальные переменные), и что не имеет никакого отношения к делать со значением this. Область действия зависит от того, где объявляется функция, но this зависит от того, как вызывается функция.

.call(this)проходитwindowобъект этого закрытия"

Мы не можем сказать, что только из кода показано на рисунке. Предположительно, вы имеете в виду, что этот блок кода не вложен внутри какой-либо другой функции, поэтому да, this будет window. Но если этот код когда-либо был вставлен внутри какой-либо другой функции, тогда this может иметь другое значение в зависимости от того, как была вызвана эта другая функция.

«Влияет ли изменение.call(this)просто()изменить что-нибудь?"

Если вы используете только (), что будет означать, что внутри функции this будет window ли что изменится что-либо зависит от this в .call(this) ли в первую очередь window. - как я уже говорил выше, если что блок были вложены в какой-либо другой функции this может быть что-то еще Сказав, что для кода показано если this было ничего, кроме window я думаю, что ваш код будет разорвать Поскольку вы объявляете функцию как это:..

this.deleteKeyword = function(model) {...} 

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

deleteKeyword($(this)); 

Единственный способ, который будет работать, если thiswindow и функция deleteKeyword() является глобальной. Если this были любыми другими объектами, функция была бы свойством этого другого объекта и, следовательно, не была бы доступна непосредственно как deleteKeyword(). Но если вы специально не хотите, чтобы deleteKeyword() был доступен из другого кода, который не показан, нет причин создавать его как свойство this. Просто объявить его var:

var deleteKeyword = function(... 

... и тогда он будет доступен только внутри этой функции и те, вложенные в него, такие как обработчик щелчка. И .call() в конце вашей функции будет избыточным, поскольку функция никогда не будет использовать this.

«Так не лучший вариант, чтобы применить JQuery объект (или, может быть, просто пустой объект) для того, чтобы повысить производительность? Не будет ли это увеличить производительность, если это будет указывать на локальную область видимости? Так как объект окна очень медленно ».

Ну, как я уже сказал, «сфера» и значение this не связаны между собой понятия. Я не уверен, почему вы беспокоитесь о производительности для этого кода. Но если вы должны применить jQuery или пустой объект с .call(jQuery) или .call({}), код не будет работать, как описано выше.

+0

Мне больше нравится любопытно об этом. Я просто хочу использовать хорошие практики. Было бы лучше, если бы я объявлял var, что = {} изменение везде 'this' for 'that' (также присоединяет это в обработчиках)? Является ли это более чистым решением? Прошу прощения, если эти вопросы звучат глупо, но это очень интересно для меня. –

+0

'var that = {}' звучит так, будто вы просто слишком усложняете это. Сделайте шаг назад: почему вы думаете, что вам нужно использовать 'this' внутри этой функции? – nnnnnn

Смежные вопросы