18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* The contents of this file are subject to the Netscape Public 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* License Version 1.1 (the "License"); you may not use this file 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* except in compliance with the License. You may obtain a copy of 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* the License at http://www.mozilla.org/NPL/ 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Software distributed under the License is distributed on an 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either expressed 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* or implied. See the License for the specific language governing 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* rights and limitations under the License. 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* The Original Code is mozilla.org code. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* The Initial Developer of the Original Code is Netscape 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Communications Corporation. Portions created by Netscape are 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Copyright (C) 1998 Netscape Communications Corporation. 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* All Rights Reserved. 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Contributor(s): pschwartau@netscape.com 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Date: 2001-07-13 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* SUMMARY: Applying Function.prototype.call to the Function object itself 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* ECMA-262 15.3.4.4 Function.prototype.call (thisArg [,arg1 [,arg2,�] ] ) 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* When applied to the Function object itself, thisArg should be ignored. 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* As explained by Waldemar (waldemar@netscape.com): 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Function.call(obj, "print(this)") is equivalent to invoking 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Function("print(this)") with this set to obj. Now, Function("print(this)") 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* is equivalent to new Function("print(this)") (see 15.3.1.1), and the latter 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* ignores the this value that you passed it and constructs a function 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* (which we'll call F) which will print the value of the this that will be 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* passed in when F will be invoked. 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* With the last set of () you're invoking F(), which means you're calling it 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* with no this value. When you don't provide a this value, it defaults to the 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* global object. 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------- 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar UBound = 0; 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar bug = '(none)'; 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar summary = 'Applying Function.prototype.call to the Function object itself'; 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar status = ''; 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar statusitems = []; 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar actual = ''; 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar actualvalues = []; 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar expect= ''; 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar expectedvalues = []; 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar self = this; // capture a reference to the global object 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar cnOBJECT_GLOBAL = self.toString(); 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar cnOBJECT_OBJECT = (new Object).toString(); 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar cnHello = 'Hello'; 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar cnRed = 'red'; 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar objTEST = {color:cnRed}; 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar f = new Function(); 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar g = new Function(); 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectf = Function.call(self, 'return cnHello'); 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectg = Function.call(objTEST, 'return cnHello'); 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = 'Section A of test'; 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = f(); 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = cnHello; 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectcaptureThis(); 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = 'Section B of test'; 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = g(); 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = cnHello; 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectcaptureThis(); 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectf = Function.call(self, 'return this.toString()'); 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectg = Function.call(objTEST, 'return this.toString()'); 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = 'Section C of test'; 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = f(); 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = cnOBJECT_GLOBAL; 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectcaptureThis(); 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = 'Section D of test'; 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = g(); 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = cnOBJECT_GLOBAL; 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectcaptureThis(); 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectf = Function.call(self, 'return this.color'); 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectg = Function.call(objTEST, 'return this.color'); 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = 'Section E of test'; 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = f(); 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = undefined; 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectcaptureThis(); 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = 'Section F of test'; 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = g(); 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = undefined; 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectcaptureThis(); 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------- 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttest(); 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------- 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction captureThis() 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project statusitems[UBound] = status; 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project actualvalues[UBound] = actual; 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project expectedvalues[UBound] = expect; 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UBound++; 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction test() 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project enterFunc ('test'); 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printBugNumber (bug); 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printStatus (summary); 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (var i = 0; i < UBound; i++) 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]); 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project exitFunc ('test'); 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 132