HTML and CSS Reference
In-Depth Information
}
};
TestCase("CircleTest", {
"test should implicitly bind to object": function () {
assertEquals(12, circle.diameter());
}
});
The fact that
this.radius
is a reference to
circle.radius
inside
circle.diameter
should not surprise you. The example in Listing 5.24 behaves
differently.
Listing 5.24
The
this
value is no longer the
circle
object
"test implicit binding to the global object": function () {
var myDiameter = circle.diameter;
assertNaN(myDiameter());
// WARNING: Never ever rely on implicit globals
// This is just an example
radius = 2;
assertEquals(4, myDiameter());
}
This example reveals that it is the caller that decides the value of
this
. In fact,
this detail was left out in the previous discussion about the execution context. In
addition to creating the activation and variable objects, and appending to the scope
chain, the
this
value is also decided when entering an execution context.
this
can be provided to a method either implicitly or explicitly.
5.4.1 Implicitly Setting
this
this
is set implicitly when calling a function using parentheses; calling it as a
function causes
this
to be set to the global object; calling it as a method causes
this
to be the object through which the function is called. “Calling the function as
a method” should be understood as calling the function as a property of an object.
This is a highly useful feature, because it allows JavaScript objects to share function
objects and still have them execute on the right object.
For instance, to borrow array methods for the
arguments
object as discussed
previously, we can simply create a property on the object whose value is the method
we want to execute, and execute it through
arguments
, implicitly setting
this
to
arguments
. Listing 5.25 shows such an example.