2013-11-18 2 views
1

Взгляни на скрипке hereOO JavaScript обходя .call

В функции шоу вызова метода JavaScript используются для this относится к переменной container в моем объекте ContactForm. Я думаю, я не слишком уверен в магии, которая делает эту работу. Может ли кто-нибудь выяснить, почему это работает, и какая хорошая альтернатива может быть?

JS

$(document).ready(function() { 
      var contactForm = { 
       container: $('#contact'), 
       config: { 
        effect: 'slideToggle', 
        speed: 400 
       }, 
       /*******************/ 
       init: function (config) { 
        $.extend(this.config, config); 
        $('<button>').text('Contact me') 
           .attr('type', 'button') 
           .insertAfter('#firstArticle') 
           .on('click', this.show); 
        //currently only logic on the close button 
       }, 
       /*******************/ 
       show: function() { 
        //using variable names to shorten up 
        var cf = contactForm, 
         container = cf.container, 
         config = cf.config; 
        if (container.is(':hidden')) { 
         cf.close.call(container); 
         container[config.effect](config.speed); 
        } 
       }, 
       /*******************/ 
       close: function() { 
        var self = $(this); 
        if (self.find('span.close').length) { 
         return; 
        } 
        $('<span>').addClass('close') 
           .text('close') 
           .prependTo(this) 
           .on('click', function() { 
            //self= span 
            self[contactForm.config.effect](500) 
           }); 
       } 
      }; 


      contactForm.init(); 

     }); 

ответ

2

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

Так

cf.close.call(container); 

вызовы cf.close со значением, установленным в thiscontainer. Гипотетически это

cf.close.call(container, 1, 'b'); 

будет делать то же самое, за исключением также проход в 1 и «B» в качестве параметров.

Звонок очень, очень похож на apply, с той разницей, что применяемый принимает все параметры как массив, а не отдельно. Таким образом, (гипотетический) второй пример был бы таким же, как

cf.close.apply(container, [1, 'b']); 

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

someFunction.apply(thisValue, arguments); 
+1

Это похоже на волшебство для меня! :) – wootscootinboogie

+0

Я не знал, что вы можете передать несколько параметров 'call', спасибо за головы. – wootscootinboogie

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