Dereferencing Javascript Variables - Revisiting

Posted April 20, 2006 at 6:44 PM

Tags: Javascript / DHTML

As posted before I was having a very hard time getting dynamic onclick methods to call what I thought was a dereferenced variable. I was getting a lot of help and great suggestions on the CFTalk list, but one guy finally posted a link to:

http://calculist.blogspot.com/2005/12/gotcha-gotcha.html

This page discussed exactly the problem I was having, the reasons I was having it, and the solution. It's all about scoping of variables. The variable that I was alerting (in the dynamic onclick) was for the method (including every iteration of the FOR loop) and therefore each link pointed to it. In the solution below, the FOR loop is replaced with a repetative method call forces each variable scopes to be local.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Javascript Dynamic Variables</title>
<script type="text/javascript">

function TestClass( strName ){
this.Name = strName;
}

TestClass.prototype.AlertValue = function( anyValue ){
alert( this.Name + " is alerting: " + anyValue );
}


function Init(){
var objContentDiv = document.getElementById( "content" );
var objA = null;
var objTest = new TestClass( "Tester" );

// This runs the for loop using a LOCAL scope for each iteration.
(function loop( intI ){
var intX = intI;

if (intI < 10){

// Create new A element.
objA = document.createElement( "a" );

// Set A display properties.
objA.style.display = "block";
objA.style.backgroundColor = "#F8F8F8";
objA.style.border = "1px solid #333333";
objA.style.padding = "10px 10px 10px 10px";
objA.style.color = "#333333";
objA.style.marginBottom = "15px";

// Create text for the link.
objA.appendChild( document.createTextNode( "I should alert " + intX + " when clicked" ) );

// Set the href.
objA.setAttribute( "href", "##" );

// Set the onclick method.
objA.onclick = function(){ objTest.AlertValue( intX ) };

// Attach the A to the content.
objContentDiv.appendChild( objA );


loop(intI + 1);
}

})(0);

}


// Is the tester class available here (just testing).
alert( "objTest is of type: " + typeof(objTest));

</script>
</head>
<body onload="Init();">

<div id="content"></div>

</body>
</html>

Post Comment  |  Ask Ben  |  Permalink  |  Other Searches  |  Print Page


You Might Also Be Interested In:



Learning ColdFusion 9 - ColdFusion 9 tutorials, samples, examples, demos

Reader Comments

Apr 3, 2007 at 9:16 AM // reply »
2 Comments

Hey thanks for this I'd be struggling with a similar problem all morning. JavaScript really is an ugly language, this solution seems a little strange but at least it works!


Apr 3, 2007 at 9:20 AM // reply »
6,371 Comments

@Pete,

I would recommend looking into jQuery. It is an awesome Javascript framework that I have just started working with. One of the things it provides is an Each() method (this is common to many Javascript frameworks). But anyway, because the Each() method takes a function literal, it forces you to create a new local scope for each loop iteration. This, in and of itself, helps take care of many of the "referencing" issues.


Apr 3, 2007 at 9:35 AM // reply »
2 Comments

Hi Ben,

I've been meaning to check out some of the JavaScript frameworks for sometime now. I will have a look into jQuery, I am told http://mootools.net is a good light weight framework.


Apr 3, 2007 at 9:37 AM // reply »
6,371 Comments

Yeah, I have heard good things about MooTools. If you are interested in some of my jQuery tinkerings:

http://www.bennadel.com/search/jquery


Post Comment  |  Ask Ben

Recent Blog Comments
Nov 7, 2009 at 5:53 PM
Ask Ben: Javascript String Replace Method
You can find here an advanced function that prepared with javascript replace function. This can make the first letters of words, sentences, lines and whatever you define automatically: http://www.m ... read »
Andrew Neely
Nov 7, 2009 at 4:56 PM
A Moment That Touched Me - The Fountainhead
Ben, Glad you enjoyed the podcast. Yeah, the Tank Riot guys can get really chatty during the episodes, but that's part of the charm of it for me. They've covered everything from Nichola Tesla to Cha ... read »
Nov 7, 2009 at 4:43 PM
Building A Fixed-Position Bottom Menu Bar (ala FaceBook)
Is it possible to make some more MenĂ¼`s ? ... read »
Jill
Nov 7, 2009 at 11:40 AM
How To Unformat Your Code (Like A Pro)
Derek, I think you might be right - sweet! Thanks for the link :) ... read »
Nov 7, 2009 at 11:25 AM
How To Unformat Your Code (Like A Pro)
I think it would be way easier to just use this http://www.logichammer.com/html-formatter/ He just released v3 and it rocks. ... read »
Jill
Nov 7, 2009 at 7:58 AM
How To Unformat Your Code (Like A Pro)
LMAO - this was pretty funny! I have to admit - I also love to reformat code so I can read it. My boss used to tell me to leave my OCD at home. Now I don't feel so bad after reading everyone else' ... read »
Nov 6, 2009 at 10:10 PM
How To Unformat Your Code (Like A Pro)
The timing of this post is just uncanny. I spent the last 15-20 minutes manually un-formatting my "Ben Nadel" style code within a CFC of mine. I was really digging the readability a few weeks ago, bu ... read »
Roe
Nov 6, 2009 at 5:11 PM
Passing Arrays By Reference In ColdFusion - SWEEET!
ArraySort also reorders the results of these java obj's ... read »