<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code.ge Blog &#187; JavaScript WTF</title>
	<atom:link href="http://www.code.ge/posts/tag/javascript-wtf/feed" rel="self" type="application/rss+xml" />
	<link>http://www.code.ge</link>
	<description>ბლოგი ვებ პროგრამირებისა და ტექნოლოგიების შესახებ</description>
	<lastBuildDate>Mon, 03 May 2010 14:38:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>JavaScript WTF Vol. 5 &#8211; magic of onchange event</title>
		<link>http://www.code.ge/posts/javascript-wtf-vol-5-magic-of-onchange-event</link>
		<comments>http://www.code.ge/posts/javascript-wtf-vol-5-magic-of-onchange-event#comments</comments>
		<pubDate>Sat, 31 Jan 2009 11:06:59 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript DOM]]></category>
		<category><![CDATA[JavaScript WTF]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=168</guid>
		<description><![CDATA[ხშირად იყენებთ HTML ფორმის ელემენტების ამ ივენთს? და რა შემთხვევაში? ალბათ უფრო SELECT ელემენტთან მუშაობისას ხომ? თქვენი არ ვიცი მაგრამ ჩემს პირად პრაქტიკაში განსაკუთრებული გამოყენება ამ ივენთს არ ჰქონია&#8230; თუმცა ორიოდე დღის წინ ყველაფერი შეიცვალა და ჩემთვის ერთი ფრიად საინტერესო აღმოჩენა გავაკეთე. ასეთი რამ გინახავათ? &#60;div onchange="handleEvent()"&#62; //some other markup &#60;/div&#62; დამეთანხმებით რომ ერთი შეხედვით [...]]]></description>
			<content:encoded><![CDATA[<p>ხშირად იყენებთ HTML ფორმის ელემენტების ამ ივენთს? <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  და რა შემთხვევაში? ალბათ უფრო SELECT ელემენტთან მუშაობისას ხომ? თქვენი არ ვიცი მაგრამ ჩემს პირად პრაქტიკაში განსაკუთრებული გამოყენება ამ ივენთს არ ჰქონია&#8230; თუმცა ორიოდე დღის წინ ყველაფერი შეიცვალა და ჩემთვის ერთი ფრიად საინტერესო აღმოჩენა გავაკეთე.</p>
<p>ასეთი რამ გინახავათ?</p>
<pre>
&lt;div onchange="handleEvent()"&gt;
//some other markup
&lt;/div&gt;
</pre>
<p>დამეთანხმებით რომ ერთი შეხედვით ამ ივენთის <strong>DIV </strong> ელემენტთან გამოყენება ცოტა არ იყოს უცნაურია ხომ? რა ცვლილება უნდა მოხდეს ისეთი <strong>DIV </strong> ელემენტში რომ მისი დამუშავება მოვახდინოთ ამგვარი გზით? ან დავუშვათ და მოხდა ასეთი ცვლილება მაგრამ რანაირად? </p>
<p>მინდა გაგახაროთ და გითხრათ, რომ, პასუხი მარტივია. <strong>DIV </strong> ელემენტში არანაირი ასეთი ცვლილება არ მოხდება, მაგრამ, თუ მის შიგნით გვაქვს რადმენიმე SELECT და INPUT ელემენტი რომელთა ცვლილების კონტროლი გვესაჭიროება ეს კოდი მომენტალურად იდეალურ გადაწყვეტად იქცევა!</p>
<p>კლასიკურად უფრო სწორად ძველი სკოლის მიდგომით ასეთი ამოცანის გადაჭრის დროს ყველა, SELECT და INPUT ელემენტის <strong>onchange</strong> ივენთს მივანიჭებდით ჰენდლერს. თუმცა თუ გავიხსენებთ ფაქტს რომ DOM დოკუმენტში ხდომილება ვრცელდება საწყისი ელემენტისგან(ელემენტი რომელზეც უშუალოდ მოხდა ესა თუ ის მოვლენა) ანუ ელემენტების იერარქიაში ქვევიდან ზევით, ჩემს მიერ ნაჩვენები კოდიც მომენტალურად პრაქტიკულ დანიშნულებას შეიძენს.  ამ ინფორმაციაზე დაყრდნობით შესაძლებელია ასეთი კოდის დაწერა:</p>
<div class="codecolorer-container html4strict blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;container&quot;</span>&gt;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">input</span></a> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;f1&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/br.html"><span style="color: #000000; font-weight: bold;">br</span></a> <span style="color: #66cc66;">/</span>&gt;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">input</span></a> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;f2&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/br.html"><span style="color: #000000; font-weight: bold;">br</span></a> <span style="color: #66cc66;">/</span>&gt;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/select.html"><span style="color: #000000; font-weight: bold;">select</span></a> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;s1&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/option.html"><span style="color: #000000; font-weight: bold;">option</span></a> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;v1&quot;</span>&gt;</span>Value 1<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/option.html"><span style="color: #000000; font-weight: bold;">option</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/option.html"><span style="color: #000000; font-weight: bold;">option</span></a> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;v2&quot;</span>&gt;</span>Value 2<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/option.html"><span style="color: #000000; font-weight: bold;">option</span></a>&gt;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/select.html"><span style="color: #000000; font-weight: bold;">select</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>ნაჩვენები კოდის შესაბამისი ამოცანა მდგომარეობს ყველა INPUT და SELECT ელემენტის <strong>onchange</strong> ივენთის დაჭერასა და შესაბამის დამუშავებაში. ნაცვლად იმისა რომ გამოვიყენოთ სათითაოდ ყველა ელემენტს onchange ივენთი, მარტივად შეგვიძლია გავაკეთოთ შემდეგი რამ:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'container'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">onchage</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//მოვიპოვოთ Event ობიექტი</span><br />
&nbsp; &nbsp;e <span style="color: #339933;">=</span> e <span style="color: #339933;">||</span> window.<span style="color: #660066;">event</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//მოვიპოვოთ საწყისი ელემენტი რომელზეც უშუალოდ დაფიქსირდა ივენთი</span><br />
&nbsp; &nbsp;<span style="color: #003366; font-weight: bold;">var</span> targetElement <span style="color: #339933;">=</span> e.<span style="color: #660066;">target</span> <span style="color: #339933;">||</span> e.<span style="color: #660066;">srcElement</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//თუ ელემენტი არის SELECT ან INPUT ტიპის შევასრულოთ დანარჩენი სამუშაო</span><br />
&nbsp; &nbsp;<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/^input|select$/i</span>.<span style="color: #660066;">test</span><span style="color: #009900;">&#40;</span>target.<span style="color: #660066;">nodeName</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//do something here</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>დამეთანხმებით რომ ძალიან მარტივია ყველა ელემენტის ცვლილების ამდაგვარი ცენტრალიზებული კონტროლი. ეს არის ზუსტად ე.წ. Event Delegation მოდელი რომელიც ძალიან პოპულარულია დღესდღეობით. რატომ არ ვიცი მაგრამ ჩემთვის onchange ივენთი იმდენად ცალსახად იყო ასოცირებული ფორმის SELECT ელემენტთან რომ მისი ამდაგვარი გზით გამოყენების შესახებ არასოდეს მიფიქრია, თუმცა საბოლოო შედეგმა ყოველგვარ მოლოდინს გადააჭარბა.</p>
<p>იმედია ეს პირადად ჩემთვის ჭკუის სასწავლებელი შემთხვევა თქვენთვისაც სასარგებლო იქნება.</p>
<p>enjoy <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/javascript-wtf-vol-5-magic-of-onchange-event/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>JavaScript WTF Vol. 4 &#8211; DOM ელემენტების იტერაცია</title>
		<link>http://www.code.ge/posts/javascript-wtf-vol-4</link>
		<comments>http://www.code.ge/posts/javascript-wtf-vol-4#comments</comments>
		<pubDate>Thu, 27 Sep 2007 12:13:58 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[JavaScript DOM]]></category>
		<category><![CDATA[JavaScript WTF]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/javascript-wtf/javascript-wtf-vol-4</guid>
		<description><![CDATA[ამასწინათ David Flanagan &#8211; ის შესანიშნავ წიგნში JavaScript The Definitive Guide წავაწყდი კოდის ფრაგმენტს რომელმაც ჯერ დამაბნია ხოლო შემდეგ აღტაცება მომგვარა, რადგან მსგავსი რამ არც მომსვლია თავში აზრად არასოდეს და არც არსად მინახავს&#8230; კოდი გამოყენებული იყო DOM ობიექტების იტერაციისათვის რამაც ძალიან მომხიბლა და არ შემიძლია ამის შესახებ აქ არ დავპოსტო. მოგეხსენებათ რომ DOM ობიექტების იტერაცია [...]]]></description>
			<content:encoded><![CDATA[<p>ამასწინათ David Flanagan  &#8211; ის შესანიშნავ წიგნში <a href="http://www.amazon.com/JavaScript-Definitive-Guide-David-Flanagan/dp/0596101996/ref=pd_bbs_sr_1/104-4842265-5992727?ie=UTF8&#038;s=books&#038;qid=1190893645&#038;sr=8-1">JavaScript The Definitive Guide</a> წავაწყდი კოდის ფრაგმენტს რომელმაც ჯერ დამაბნია ხოლო შემდეგ აღტაცება მომგვარა, რადგან მსგავსი რამ არც მომსვლია თავში აზრად არასოდეს და არც არსად მინახავს&#8230;</p>
<p>კოდი გამოყენებული იყო DOM ობიექტების იტერაციისათვის რამაც ძალიან მომხიბლა და არ შემიძლია ამის შესახებ აქ არ დავპოსტო.<span id="more-68"></span></p>
<p>მოგეხსენებათ რომ DOM ობიექტების იტერაცია შესაძლოა ხშირად დაგვჭირდეს გარკვეული ამოცანების გადასაჭრელად, მათ შორის ერთერთი მნიშვნელოვანი არის კონკრეტული DOM ობიექტის მომდევნო ან წინა ელემენტის მიღება. ამისათვის არსებობს DOM ობიექტის შესაბამისი თვისებები რომლებიც მიუთითებენ ასეთ ელემენტებზე: nextSibling მომდევნო ელემენტისათვის და previousSibling შესაბამისად წინა ელემენტისათვის. თუმცა პირადად ჩემთვის დიდ სარგებლობას ეს თვისებები არ წარმოადგენენ რადგან ხშირად (X)HTML კოდში ელემენტის წინ/შემდეგ შესაძლოა ტექსტური ელემენტი(textNode) იყოს განთავსებული რომელიც უმეტეს შემთხვევაში არაფერში არ არის გამოსადეგი&#8230; ასევე უფრო ხშირად საჭიროა მაგალითად კონკრეტული span ელემენტის წინ არსებული div ელემენტის მოპოვება, ხოლო ამ span &#8211; სა და div &#8211; ს შორის შესაძლოა განთავსებული იყოს სხვა ელემენტები&#8230; გამომდინარე აქედან დაწერილი მაქვს შესაბამისი მეთოდები რომლებიც ამ პრობლემას მიგვარებენ&#8230; თუმცა აღნიშნული ფაქტის მერე ეს მეთოდები გადავწერე რომლებსაც აქ განვიხილავ მაგალითის სახით.</p>
<p>კოდი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> Util <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <br />
&nbsp; dom<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">/**<br />
&nbsp; &nbsp; &nbsp;* param obj ობიექტი რომლის შემდეგი ელემენტის მოპოვებაც არის საჭირო<br />
&nbsp; &nbsp; &nbsp;* param tagName ელემენტის ტეგის სახელი ზუსტი ფილტრაციისათვის<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; getNextSibling<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>obj<span style="color: #339933;">,</span> tagName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>obj.<span style="color: #660066;">nextSibling</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> o <span style="color: #339933;">=</span> obj.<span style="color: #660066;">nextSibling</span><span style="color: #339933;">;</span> o<span style="color: #339933;">;</span> o <span style="color: #339933;">=</span> o.<span style="color: #660066;">nextSibling</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>o.<span style="color: #660066;">tagName</span> <span style="color: #339933;">&amp;&amp;</span> o.<span style="color: #660066;">tagName</span>.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> tagName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> o<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">/**<br />
&nbsp; &nbsp; &nbsp;* param obj ობიექტი რომლის წინა ელემენტის მოპოვებაც არის საჭირო<br />
&nbsp; &nbsp; &nbsp;* param tagName ელემენტის ტეგის სახელი ზუსტი ფილტრაციისათვის<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; getPrevSibling<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>obj<span style="color: #339933;">,</span> tagName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>obj.<span style="color: #660066;">previousSibling</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> o <span style="color: #339933;">=</span> obj.<span style="color: #660066;">previousSibling</span><span style="color: #339933;">;</span> o<span style="color: #339933;">;</span> o <span style="color: #339933;">=</span> o.<span style="color: #660066;">previousSibling</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>o.<span style="color: #660066;">tagName</span> <span style="color: #339933;">&amp;&amp;</span> o.<span style="color: #660066;">tagName</span>.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> tagName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> o<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>კეთილი და პატიოსანი, ეს ორი მეთოდი სავსებით საკმარისია მიზნის მისაღწევად, და მისი გამოყენების მაგალითები გამოიყურება შემდეგნაირად:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> el <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'elemID'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> nextSibling <span style="color: #339933;">=</span> Util.<span style="color: #660066;">dom</span>.<span style="color: #660066;">getNextSibling</span><span style="color: #009900;">&#40;</span>el<span style="color: #339933;">,</span> <span style="color: #3366CC;">'p'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//დააბრუნებს ელემენტის შემდგომ არსებულ პირველსავე p ელემენტს</span><br />
<span style="color: #003366; font-weight: bold;">var</span> nextSibling <span style="color: #339933;">=</span> Util.<span style="color: #660066;">dom</span>.<span style="color: #660066;">getPrevSibling</span><span style="color: #009900;">&#40;</span>el<span style="color: #339933;">,</span> <span style="color: #3366CC;">'div'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//დააბრუნებს ელემენტის წინ არსებულ პირველსავე div ელემენტს</span></div></td></tr></tbody></table></div>
<p>მეთოდები საკმარისად მარტივია, იმ შემთხვევაში თუ მეთოდის პირველი პარამეტრის nextSibling/previousSibling თვისებები მიუთითებენ კონკრეტულ DOM ელემენტებს აქვს აზრი ელმენტების იტერაციას, if პირობაში მოწმდება გააჩნია თუ არა ელემენტს tagName თვისება რადგან textNode ტიპის ელემენტებს მსგავსი არაფერი გააჩნია, ხოლო თუ ეს თვისება არსებობს და მას აქვს მნიშვნელობა ხდება შედარება მეთოდის მეორე პარამეტრად გადაცემულ მნიშვნელობასთან. თუ ორი მნიშვნელობა უდრის ერთმანეთს მეთოდი დააბრუნებს მიმდინარე ობიექტს და შეწყვეტს მუშაობას.</p>
<p>თუმცა ეს არ არის საინტერესო&#8230; საინტერესოა სწორედ for ციკლი, კერძოდ კი შემდეგი ფრაგმენტი:</p>
<pre>for (var o = obj.previousSibling; o; o = o.previousSibling) </pre>
<p>რა ხდება ამ კოდში? ყველამ კარგად ვიცით for ციკლის კონსტრუქცია და მისი სამივე ნაწილის დანიშნულება, თუმცა რა ხდება ამ შემთხვევაში?</p>
<p>1) კონსტრუქციის პირველ ნაწილში ხდება o ცვლადის ინიციალიზაცია და მას ენიჭება საწყისი მნიშვნელობა ანუ obj.previousSibling;<br />
2) კონსტრუქციის მეორე ნაწილში მოწმდება პირობა, ანუ o ობიექტი არ უნდა იყოს null, ზუსტად ეს განაპირობებს ციკლის შესრულება გაგრძელდება თუ არა;<br />
3) კონსტრუქციის მესამე ნაწილში ყოველ შემდეგ იტერაციაზე o ობიექტს ენიჭება იერარქიაში მის წინ მყოფი ელემენტი;</p>
<p>სულ ეს არის და ეს, თუ ვერ დაკმაყოფილდება კონსტრუქციის მეორე ნაწილისათვის პირობა ციკლი შეწყვეტს მუშაობას, ხოლო იმ შემთხვევაში თუ უკვე ციკლის შემდეგ დაკმაყოფილდება პირობა და მოიძებნება სასურველი ელემენტი, მოხდება მეთოდიდან მისი დაბრუნება.</p>
<p>შესაძლოა ეს ძალიან მარტივად მოგეჩვენოთ თუმცა ჩემთვის პირადად ძალიან სასიამოვნო დეტალი იყო რადგან ობიექტების იტერაციის მსგავსი მეთოდი არ მინახავს და არც გამომიყენებია <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>მარტივი მაგრამ ჩემის აზრით ძალიან სასარგებლო დეტალი ენისა რომელის დეტალებიც დღემდე მართლა ბნელით არის მოცული <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/javascript-wtf-vol-4/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>JavaScript WTF Vol. 3 &#8211; onload და onunload მოვლენები</title>
		<link>http://www.code.ge/posts/javascript-wtf-vol-3-2</link>
		<comments>http://www.code.ge/posts/javascript-wtf-vol-3-2#comments</comments>
		<pubDate>Fri, 02 Mar 2007 06:17:57 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript WTF]]></category>

		<guid isPermaLink="false">http://www.ioseb.com/?p=27</guid>
		<description><![CDATA[ვაგრძელებ WTF სერიას და ამჯერად ყურადღებას შევაჩერებ window ობიექტის onload მოვლენაზე. რა საჭიროა ის, რაში გამოიყენება, როგორ გამოვიყენოთ და როგორ ავირიდოთ თავიდან მასთან დაკავშირებული პრობლემები. პირველ რიგში საჭიროა იმის თქმა რომ ეს მოვლენა სრულდება მაშინ როდესაც ბროუზერი სრულად ჩამოტვირთავს დოკუმენტს და თუ ამ მოვლენას აქვს მინიჭებული რაიმე ფუნქცია, მოხდება მისი გამოძახება. ფუნქცია ამ მოვლენას შეიძლება [...]]]></description>
			<content:encoded><![CDATA[<p>ვაგრძელებ WTF სერიას და ამჯერად ყურადღებას შევაჩერებ window ობიექტის onload მოვლენაზე. რა საჭიროა ის, რაში გამოიყენება, როგორ გამოვიყენოთ და როგორ ავირიდოთ თავიდან მასთან დაკავშირებული პრობლემები.<span id="more-27"></span></p>
<p>პირველ რიგში საჭიროა იმის თქმა რომ ეს მოვლენა სრულდება მაშინ როდესაც ბროუზერი სრულად ჩამოტვირთავს დოკუმენტს და თუ ამ მოვლენას აქვს მინიჭებული რაიმე ფუნქცია, მოხდება მისი გამოძახება.</p>
<p>ფუნქცია ამ მოვლენას შეიძლება მივანიჭოთ შემდეგნაირად:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">//ანონიმური ფუნქციის გამოყენება</span><br />
window.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;window.onload test&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//წინასწარ განსაზღვრული ფუნქციის გამოყენება</span><br />
<span style="color: #003366; font-weight: bold;">function</span> init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;initializing application&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
window.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> init<span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>ორივე მოცემულ შემთხვევაში ფუნქციების გამოძახება მოხდება მაშინათვე როგორც კი ბრაუზერი დაასრულებს დოკუმენტის ჩამოტვირთვას. თავიდანვე ცხადი ხდება თუ რისთვის შეიძლება გამოვიყენოთ ეს მოვლენა და როგორ უნდა გამოვიყენოთ იგი, თუმცა ღირს იმის აღნიშვნა რომ თანამედროვე ვებ აპლიკაციებში ხშირად არის საჭირო ბევრი ობიექტისა თუ დოკუმენტის ელემენტის ინიციალიზაცია მხოლოდ დოკუმენტის სრულად ჩამოტვირთვის შემდეგ.</p>
<p>თუმცა ამ კოდის წაკითხვის შემდეგ ჩნდება ასეთი შეკითხვები: მხოლოდ ერთხელ შეიძლება მივანიჭოთ ფუნქცია ამ მოვლენას? თუ უკვე აქვს მას მინიჭებული სხვა ფუნქცია მაშინ რა მოუვა მას თუ ვეცდებით ახალი ფუნქციის მინიჭებას? თუ ვიყენებთ რაიმე ბიბლიოთეკას რომელიც თავის მხრივ იყენებს ამ მოვლენას ინიციალიზაციისათვის ჩვენ როგორ მოვიქცეთ?</p>
<p>ყველა ამ შეკითხვის პასუხი არსებობს და არსებობს საკმაოდ მოხერხებული გამოსავალი, რომელის შესახებაც რამდენიმე წლის წინ წავიკითხე ინტერნეტში.</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">/**<br />
&nbsp;*@param function<br />
&nbsp;*/</span><br />
<span style="color: #003366; font-weight: bold;">function</span> windowAddOnLoad<span style="color: #009900;">&#40;</span>newOnLoadFunction<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//შევინახოთ ახალ ცვლადში onload - ის მიმდინარე მნიშვნელობა</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> oldOnLoadFunction <span style="color: #339933;">=</span> window.<span style="color: #000066;">onload</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">/*თუ onload - ის მნიშვნელობა არ არის ფუნქციის ტიპის<br />
&nbsp; &nbsp; &nbsp; &nbsp;მივანიჭოთ მას პარამეტრად გადმოცემული მნიშვნელობა*/</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> window.<span style="color: #000066;">onload</span> <span style="color: #339933;">!=</span> <span style="color: #3366CC;">'function'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; window.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> newOnLoadFunction<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">/* წინააღმდეგ შემთხვევაში, onload მოვლენას მივანიჭოთ ახალი<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ანონიმური ფუნქცია რომელიც გამოძახებისას გამოიძახებს ჯერ<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ძველ ფუნქციას ხოლო შემდეგ უკვე ახალ ფუნქციას*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; window.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//ძველი ფუნქციის გამოძახება</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; oldOnLoadFunction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//ახალი ფუნქციის გამოძახება</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newOnLoadFunction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ამ ფუნქციის დახმარებით უკვე თავისუფლად არის შესაძლებელი onload მოვლენის იმდენჯერ გამოყენება რამდენჯერაც ეს იქნება აუცილებელი კონკრეტული ამოცანისათვის.</p>
<p>გამოყენების კოდი კი შეიძლება იყოს ასეთი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;test on load&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//passing function reference</span><br />
windowAddOnLoad<span style="color: #009900;">&#40;</span>init<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//passing anonymous function</span><br />
windowAddOnLoad<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;test anonymous function&quot;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>მაგალითში ჩანს რომ სურვილის მიხედვით windowAddOnLoad ფუნქციას თავისუფლად შეგვიძლია გადავცეთ ან უკვე გამზადებული ფუნქცია, ან თუ საჭიროა გამოვიყენოთ ანონიმური ფუნქცია. შედეგი იქნება აბსოლუტურად ერთნაირი ნებისმიერ შემთხვევაში.</p>
<p>onload მოვლენიდან გამომდინარე ასევე მინდა ყურადღება შევაჩერო window ობიექტის onunload მოვლენაზე, რომელიც არის onload მოვლენის საპირისპირო და გამოიძახება დოკუმენტის დატოვების დროს. გარდა იმისა რომ აპლიკაციას ესაჭიროება ინიციალიზაცია და ხშირად საჭიროა onload მოვლენის გამოყენება მნიშვნელოვანია ყურადღება მივაქციოთ იმ ფაქტს რომ ბროუზერების მეხსიერების მენეჯმენტი და garbage collector &#8211; ის მუშაობა JavaScript-ისთვის არ არის ისეთი ეფექტური როგორიც ეს არის დავუშვათ Java-ში და ხშირ შემთხვევაში საჭიროა მეხსიერების ხელოვნურად გაწმენდა (რაიმე დესტრუქტორი ფუნქციების შექმნა და მათი გამოძახება) თუმცა არის ისეთი შემთხვევები რომ ჩვენს მიერ დაკავებულ მეხსიერებას ვერ გავწმენდთ იქამდე სანამ კლიენტი იმყოფება კონკრეტულ გვერდზე და იგი იყენებს აპლიკაციას. ასეთ შემთხვევებში მეხსიერების გაწმენდა უნდა მოხდეს გვერდის დატოვების მცდელობისას onunload მოვლენის გამოყენებით. ზემოთ დაწერილი ნიმუშის საფუძველზე ადვილად არის შესაძლებელი ფუნქციის გადაწერა ამ მოვლენისათვის, ხოლო მისი გამოყენება იქნება ანალოგიური windowAddOnLoad ფუნქციის გამოყენებისა.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/javascript-wtf-vol-3-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript WTF Vol. 2 &#8211; ანონიმური ფუნქციები</title>
		<link>http://www.code.ge/posts/javascript-wtf-vol-2</link>
		<comments>http://www.code.ge/posts/javascript-wtf-vol-2#comments</comments>
		<pubDate>Thu, 22 Feb 2007 18:59:49 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript WTF]]></category>

		<guid isPermaLink="false">http://www.ioseb.com/?p=24</guid>
		<description><![CDATA[ანონიმური ფუნქციები JavaScript-ში ერთერთი მოქნილი და სასარგებლო საშუალებაა თუმცა პერიოდულად გარკვეული სირთულეები მათი გამოყენებისას მაინც გვხვდება. ამჯერად ყურადღება მინდა გავამახვილო ანონიმური ფუნქციისა და თვით იმ ფუნქციის კონტექსტზე რომლის შიგნითაც ხდება ანონიმური ფუნქციის შექმნა. მაგალითისათვის განვიხილოთ შემდეგი კოდი: 12345678910111213141516171819202122232425262728293031function init&#40;&#41; &#123; &#160; &#160; &#160; &#160; //private variable &#160; &#160; var privateVar = &#34;This is private variable&#34;; [...]]]></description>
			<content:encoded><![CDATA[<p>ანონიმური ფუნქციები JavaScript-ში ერთერთი მოქნილი და სასარგებლო საშუალებაა თუმცა პერიოდულად გარკვეული სირთულეები მათი გამოყენებისას მაინც გვხვდება.<span id="more-24"></span></p>
<p>ამჯერად ყურადღება მინდა გავამახვილო ანონიმური ფუნქციისა და თვით იმ ფუნქციის კონტექსტზე რომლის შიგნითაც ხდება ანონიმური ფუნქციის შექმნა. </p>
<p>მაგალითისათვის განვიხილოთ შემდეგი კოდი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//private variable</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> privateVar <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;This is private variable&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//public variable</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">publicVar</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;This is public variable&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//private method</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> privateMethod <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;This is private method&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//public method</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">publicMethod</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;This is public method&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//initialize anchor onclick</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> anchor <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;test&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; anchor.<span style="color: #660066;">onclick</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>privateVar<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//alert private variable</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>publicVar<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//alert public variable</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; privateMethod<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//call private method</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; publicMethod<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//call public method</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//window onload event calls init function</span><br />
window.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> init<span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>ასევე ამ მაგლითისთვის საჭიროა შემდეგი HTML კოდი:</p>
<div class="codecolorer-container html4strict blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/a.html"><span style="color: #000000; font-weight: bold;">a</span></a> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;test&quot;</span>&gt;</span>Test onclick<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/a.html"><span style="color: #000000; font-weight: bold;">a</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>განვიხილოთ init() ფუნქცია რომელიც დოკუმენტის სრულად ჩატვირთვის თანავე გამოიძახება (იხ. window.onload = init;). მას გააჩნია რამდენიმე private და public წევრი. ასევე ამ ფუნქციის მეშვეობით ხდება a ელემენტის onclick მოვლენისათვის (ანონიმური)ფუნქციის მინიჭება, რომელიც შესრულებისას test() ფუნქციის ყველა წევრს მიმართავს(იძახებს) მიმდევრობით. თუ ამ კოდს შევასრულებთ ერთმანეთის მიყოლებით მივიღებთ შეტყობინებებს:</p>
<ul>
<li><strong>This is private variable</strong></li>
<li><strong>This is public variable</strong></li>
<li><strong>This is private method</strong></li>
<li><strong>This is public method</strong></li>
</ul>
<p>ერთი შეხედვით ყველაფერი ნათელია და ყველაფერი სწორად მუშაობს. ასევე შეგვიძლია გავაკეთოთ დასკვნა რომ init() ფუნქციის კონტექსტს აბსოლუტურად იზიარებს anchor.onclick &#8211; ისთვის განსაზღვრული ანონიმური ფუნქცია. თუმცა კოდს თუ გავუკეთებთ მცირე მოდიფიკაციას დავინახავთ რომ სურათი რადიკალურად იცვლება და ამან შეიძლება გარკვეული პრობლემები წარმოშვას გარკვეულ შემთხვევებში, კოდის ბოლო სტრიქონი ჩავანაცვლოთ შემდეგი კოდით:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> callInit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> testInit <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//window onload event calls callInit function</span><br />
window.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> callInit<span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>ამჯერად a ელემენტზე დაკლივის შემდეგ მივიღებთ მხოლოდ ერთ შეტყობინებას:</p>
<ul>
<li><strong>This is private variable</strong></li>
</ul>
<p>და კოდი შეწყვეტს მუშაობს შემდეგი შეტყობინებით <strong>&#8220;publicVar is not defined&#8221;</strong>&#8230; რა მოხდა ამ შემთხვევაში? onclick ელემენტის ანონიმურმა ფუნქციამ დაკარგა კავშირი init() ფუნქციასთან, მაგრამ მხოლოდ ნაწილობრივ? თუ init() ფუნქციის private წევრებზე აქვს წვდომა რატომ public წევრებზე არ აქვს წვდომა? სიმართლე რომ ითქვას ბოლომდე ვერ გავერკვიე ამ დეტალებში და გარკვეულ წილად ბუნდოვანი დარჩა რაღაც დეტალები რომ აქ ავხსნა, მაგრამ რამდენიმე(იმედია სწორი) დასკვნის გაკეთება შეგვიძლია აქედან:</p>
<ul>
<li><strong>ანონიმური ფუნქცია იზიარებს init ფუნქციის კონტექსტს მთლიანად(აქვს წვდომა მის ყველა წევრთან) მიუხედავად იმისა წევრი არის public თუ private</strong>. </li>
<li><strong>ყველაფერი ერთ კონტექსტში სრულდება და init ფუნქციის ყველა წევრი სტატიკურია და არ საჭიროების init &#8211; ის ახალ ეგზემპლარს.</strong></li>
<li><strong>თუ init არ გამოიძახება პირდაპირ, არამედ მოხდება მისი ახალი ობიექტის(new init()) შექმნა, onclick &#8211; ისთვის განსაზღვრული ანონიმური ფუნქცია ნაწილობრივ გაიზიარებს init ფუნქციის კონტექსტს, არ დაკარგავს წვდომას მის private წევრებთან მაგრამ დაკარგავს წვდომას მის public წევრებზე, ანუ აღმოჩნდება ობიექტის(რომელიც იქმნება new ოპერატორით) კონტექსტს მიღმა</strong></li>
</ul>
<p>არის თუ არა ასეთი მდგომარეობიდან გამოსავალი? დიახ არის და შემდეგ მაგალითში ნაჩვენებია ასეთი შემთხვევა:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//private variable</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> privateVar <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;This is private variable&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//public variable</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">publicVar</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;This is public variable&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//private method</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> privateMethod <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;This is private method&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//public method</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">publicMethod</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;This is public method&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//initialize anchor onclick</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> anchor <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;test&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//create reference to current object</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> ref <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; anchor.<span style="color: #660066;">onclick</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> initRef <span style="color: #339933;">=</span> ref<span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//create reference to object</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>privateVar<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>initRef.<span style="color: #660066;">publicVar</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//now call publicVar through initRef object reference</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; privateMethod<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; initRef.<span style="color: #660066;">publicMethod</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//now call publicMethod through initRef object reference</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">function</span> callInit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> testInit <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//window onload event calls callInit function</span><br />
window.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> callInit<span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>მოდიფიცირებულ კოდში ყურადღება უნდა მივაქციოთ var ref = this; ნაწილს, რადგან 1) ამ კოდს ვწერთ onclick ანონიმური ფუნქციის გარეთ; 2) onclick ანონიმურ ფუნქციაში ვქმნით ახალ initRef ცვლადს და მას ვანიჭებთ ref ცვლადს (var initRef = ref;); 3) init &#8211; ის public წევრებს მივმართავთ initRef &#8211; ის საშუალებით;</p>
<p>რეზულტატი აბსოლუტურად იგივეა რაც იყო პირველ შემთხვევაში თუმცა აქ უნდა გავამახვილოთ ყურადღება ref=this; კოდზე, რატომ დავწერეთ ეს კოდი onclick ანონიმური ფუნქციის გარეთ და არა თვით ფუნქციაში მაგ. var initRef = this;? ასე რომ დაგვეწერა ფუნქციის შიგნით this უკვე ამ ფუნქციაზე მიუთითებდა და არა init ფუნქციის რომელიმე ეგზემპლარზე, და წვდომა init &#8211; ის ობიექტთან კვლავ დაიკარგებოდა.</p>
<p>შეიძლება ბუნდოვნად და რთულად ავხსენი ეს პრობლემა, თუმცა კიდევ ვიმეორებ გარკვეული საკითხები ჩემთვის ისევ ბურუსით არის მოცული.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/javascript-wtf-vol-2/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JavaScript WTF Vol. 1 &#8211; ფუნქციის call და apply მეთოდები</title>
		<link>http://www.code.ge/posts/javascript-wtf-vol-1</link>
		<comments>http://www.code.ge/posts/javascript-wtf-vol-1#comments</comments>
		<pubDate>Thu, 22 Feb 2007 15:53:04 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript WTF]]></category>

		<guid isPermaLink="false">http://www.ioseb.com/?p=23</guid>
		<description><![CDATA[შემთხვევით რაღაც JavaScript კოდის გარჩევისას თვალი მოვკარი მსგავს: func.call() და func.apply() კოდს. თავიდან არ მივაქციე ყურადღება მაგრამ რამდენიმე დღის შემდეგ სხვა ადგილას მოვკარი თვალი იგივე ტიპის კოდს, თუმცა პირველად და მეორედ ნანახ კოდს ერთმანეთთან კავშირი არ ქონდა. დავინტერესდი და მოვიძიე ინფორმაცია ამ ორი მეთოდის call() და apply() &#8211; ს შესახებ და აღმოვაჩინე რომ&#8230; თურმე ყველა [...]]]></description>
			<content:encoded><![CDATA[<p>შემთხვევით რაღაც JavaScript კოდის გარჩევისას თვალი მოვკარი მსგავს: func.call() და func.apply() კოდს. თავიდან არ მივაქციე ყურადღება მაგრამ რამდენიმე დღის შემდეგ სხვა ადგილას მოვკარი თვალი იგივე ტიპის კოდს, თუმცა პირველად და მეორედ ნანახ კოდს ერთმანეთთან კავშირი არ ქონდა. დავინტერესდი და მოვიძიე ინფორმაცია ამ ორი მეთოდის call() და apply() &#8211; ს შესახებ და აღმოვაჩინე რომ&#8230;<span id="more-23"></span></p>
<p>თურმე ყველა ფუნქციას გააჩნია call() და apply() მეთოდი, (JavaScript &#8211; ში ხომ ყველაფერი ობიექტია, თვით ფუნქციაც ასე რომ ფუნქციას სავსებით შეიძლება გააჩნდეს მეთოდები). ეს მეთოდები ფუნქციის ისე გამოძახების საშულებას გვაძლევს თითქოს ეს ფუნქცია სხვა რომელიმე ობიექტის მეთოდი იყოს.</p>
<p>ტესტირების მიზნით დავწერე ასეთი სკრიპტი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> test<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">variable</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;test&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">member</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">function</span> testParams<span style="color: #009900;">&#40;</span>paramOne<span style="color: #339933;">,</span> paramTwo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">memberParams</span><span style="color: #009900;">&#40;</span>paramOne<span style="color: #339933;">,</span> paramTwo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">var</span> objOne <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; member<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">variable</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
&nbsp; memberParams<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>paramOne<span style="color: #339933;">,</span> paramTwo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>paramOne <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot; - &quot;</span> <span style="color: #339933;">+</span> paramTwo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//call test()</span><br />
test.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>objOne<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<br />
<span style="color: #006600; font-style: italic;">//call tetsParams()</span><br />
testParams.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>objOne<span style="color: #339933;">,</span> <span style="color: #3366CC;">'paramOne test'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'paramTwo test'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>თუ კოდს დააკვირდებით დაინახავთ რომ test() ფუნქცია ოდნავ უცნაურად გამოიყურება, კერძოდ კი this.member() მეთოდის გამოძახება,  რადგან test() ფუნქციაში მსგავსი წევრი არ არსებობს. member() მეთოდი სინამდვილეში objOne ობიექტის წევრია და მას არანაირი კავშირი არ აქვს test() ფუნქციასთან (გარდა იმისა რომ test() ფუნქცია გლობალურია და member() მეთოდს მასზე წვოდამ გააჩნია). თავის მხრივ თუ დავაკვრიდებით member() მეთოდს ისიც უცნაურად გამოიყურება რადგანდ objOne ობიექტს არანაირი &#8220;variable&#8221; წევრი არ გააჩნია, თუმცა ცვლადს იგივე სახელით test() ფუნქციაში ვხედავთ.</p>
<p>ამ კოდის test.call(objOne); შესრულების რეზულტატი კი აბსოლუტურად სწორია და test() ფუნქცია წარმატებით იძახებს member() მეთოდს ისე თითქოს ის მისი წევრი მეთოდი იყოს, ხოლო member() ფუნქციას წვდომა გააჩნია &#8220;variable&#8221; ცვლადზე თითქოს ეს ცვლადი objOne ობიექტის წევრი იყოს.</p>
<p>რა ხდება სინამდვილეში? როგორც ზემოთ ავღნიშნე call() მეთოდი ფუნქციის (ამ შემთხვევაში test() ფუნქცია) ისე გამოძახების საშულებას გვაძლევს თითქოს ეს ფუნქცია სხვა რომელიმე ობიექტის (ამ შემთხვევაში objOne ობიექტი) მეთოდი იყოს. იგივე ეხება apply() მეთოდსაც.</p>
<p>უფრო მეტი სიცხადისათვის პირველი მაგალითი შეგვიძლია გადავწეროთ ასე:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> objTwo <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; variable<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;test simple&quot;</span><span style="color: #339933;">,</span><br />
&nbsp; test<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">member</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
&nbsp; member<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">variable</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
objTwo.<span style="color: #660066;">test</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>თუ შევასრულებთ ამ კოდს დავინახავთ რომ რეზულტატი იდენტურია პირველად შესრულებული კოდისა.</p>
<p>რა განსხვავებაა call() და apply() მეთოდებს შორის? ერთადერი განსხვავება რაც ამ ორ მეთოდს შორის არის ეხება პარამეტრებს. call() მეთოდის გამოყენების შემთხვევაში, თუ გამოძახებულ ფუნქციას გვინდა გადავცეთ პარამეტრი ან პარამეტრები კოდი დაიწერება ასე tetsParams.call(objOne, &#8216;paramOne test&#8217;, &#8216;paramTwo test&#8217;); ანუ პარამეტრები გამოიყოფა ტრადიციულად მძიმით. ხოლო apply() მეთოდის გამოყენების შემთხვევაში კი კოდს უნდა ქონდეს ასეთი სახე: tetsParams.apply(objOne, ['paramOne test', 'paramTwo test']); ანუ პარამეტრები გამოძახებულ ფუნქციას უნდა გადაეცეს მასივის სახით.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/javascript-wtf-vol-1/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
