Skip to content

Commit 9776354

Browse files
committed
Core: Employ strict mode to simplify Deferred callback context handling
This reverts commit ecc97e5. This reverts commit d8b1408.
1 parent ecc97e5 commit 9776354

File tree

4 files changed

+42
-52
lines changed

4 files changed

+42
-52
lines changed

build/tasks/build.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ module.exports = function( grunt ) {
2323
baseUrl: "src",
2424
name: "jquery",
2525

26+
// Allow strict mode
27+
useStrict: true,
28+
2629
// We have multiple minify steps
2730
optimize: "none",
2831

src/callbacks.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,6 @@ jQuery.Callbacks = function( options ) {
7676
memory = queue.shift();
7777
while ( ++firingIndex < list.length ) {
7878

79-
// Preserve null/undefined context
80-
// (which non-strict `apply` maps to the global object)
81-
self.context = memory[ 0 ];
82-
8379
// Run callback and check for early termination
8480
if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
8581
options.stopOnFalse ) {
@@ -96,7 +92,7 @@ jQuery.Callbacks = function( options ) {
9692
memory = false;
9793
}
9894

99-
self.context = firing = false;
95+
firing = false;
10096

10197
// Clean up if we're done firing for good
10298
if ( locked ) {

src/deferred.js

Lines changed: 33 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,9 @@ jQuery.extend( {
7171
},
7272
then: function( onFulfilled, onRejected, onProgress ) {
7373
var maxDepth = 0;
74-
function resolve( depth, deferred, callbacks, handler, special ) {
74+
function resolve( depth, deferred, handler, special ) {
7575
return function() {
76-
77-
// Recover null/undefined context from global `this`
78-
var that = depth === 0 ? callbacks.context : this,
76+
var that = this,
7977
args = arguments,
8078
mightThrow = function() {
8179
var returned, then;
@@ -115,10 +113,8 @@ jQuery.extend( {
115113
if ( special ) {
116114
then.call(
117115
returned,
118-
resolve( maxDepth, deferred, callbacks, Identity,
119-
special ),
120-
resolve( maxDepth, deferred, callbacks, Thrower,
121-
special )
116+
resolve( maxDepth, deferred, Identity, special ),
117+
resolve( maxDepth, deferred, Thrower, special )
122118
);
123119

124120
// Normal processors (resolve) also hook into progress
@@ -129,11 +125,9 @@ jQuery.extend( {
129125

130126
then.call(
131127
returned,
132-
resolve( maxDepth, deferred, callbacks, Identity,
133-
special ),
134-
resolve( maxDepth, deferred, callbacks, Thrower,
135-
special ),
136-
resolve( maxDepth, deferred, callbacks, Identity,
128+
resolve( maxDepth, deferred, Identity, special ),
129+
resolve( maxDepth, deferred, Thrower, special ),
130+
resolve( maxDepth, deferred, Identity,
137131
deferred.notify )
138132
);
139133
}
@@ -209,7 +203,6 @@ jQuery.extend( {
209203
resolve(
210204
0,
211205
newDefer,
212-
tuples[ 0 ][ 3 ],
213206
jQuery.isFunction( onProgress ) ?
214207
onProgress :
215208
Identity,
@@ -222,7 +215,6 @@ jQuery.extend( {
222215
resolve(
223216
0,
224217
newDefer,
225-
tuples[ 1 ][ 3 ],
226218
jQuery.isFunction( onFulfilled ) ?
227219
onFulfilled :
228220
Identity
@@ -234,7 +226,6 @@ jQuery.extend( {
234226
resolve(
235227
0,
236228
newDefer,
237-
tuples[ 2 ][ 3 ],
238229
jQuery.isFunction( onRejected ) ?
239230
onRejected :
240231
Thrower
@@ -256,39 +247,34 @@ jQuery.extend( {
256247
var list = tuple[ 2 ],
257248
stateString = tuple[ 5 ];
258249

259-
list.add( function() {
260-
261-
// Handle state
262-
if ( stateString ) {
250+
// promise.progress = list.add
251+
// promise.done = list.add
252+
// promise.fail = list.add
253+
promise[ tuple[ 1 ] ] = list.add;
263254

264-
// state = "resolved" (i.e., fulfilled)
265-
// state = "rejected"
266-
state = stateString;
255+
// Handle state
256+
if ( stateString ) {
257+
list.add(
258+
function() {
267259

268-
// progress_callbacks.lock
269-
tuples[ 0 ][ 2 ].lock();
260+
// state = "resolved" (i.e., fulfilled)
261+
// state = "rejected"
262+
state = stateString;
263+
},
270264

271265
// rejected_callbacks.disable
272266
// fulfilled_callbacks.disable
273-
tuples[ 3 - i ][ 2 ].disable();
274-
}
275-
276-
// Fire .then handlers, recovering null/undefined context from global `this`
277-
// progress_handlers.fire
278-
// fulfilled_handlers.fire
279-
// rejected_handlers.fire
280-
tuple[ 3 ].fireWith( list.context, arguments );
281-
} );
267+
tuples[ 3 - i ][ 2 ].disable,
282268

283-
// promise.progress = list.add
284-
// promise.done = list.add
285-
// promise.fail = list.add
286-
promise[ tuple[ 1 ] ] = list.add;
269+
// progress_callbacks.lock
270+
tuples[ 0 ][ 2 ].lock
271+
);
272+
}
287273

288-
// deferred.notifyWith = list.fireWith
289-
// deferred.resolveWith = list.fireWith
290-
// deferred.rejectWith = list.fireWith
291-
deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
274+
// progress_handlers.fire
275+
// fulfilled_handlers.fire
276+
// rejected_handlers.fire
277+
list.add( tuple[ 3 ].fire );
292278

293279
// deferred.notify = function() { deferred.notifyWith(...) }
294280
// deferred.resolve = function() { deferred.resolveWith(...) }
@@ -297,6 +283,11 @@ jQuery.extend( {
297283
deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
298284
return this;
299285
};
286+
287+
// deferred.notifyWith = list.fireWith
288+
// deferred.resolveWith = list.fireWith
289+
// deferred.rejectWith = list.fireWith
290+
deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
300291
} );
301292

302293
// Make the deferred a promise

src/wrapper.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@
3838
// Pass this if window is not defined yet
3939
}( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
4040

41-
// Support: Firefox 18+
42-
// Can't be in strict mode, several libs including ASP.NET trace
43-
// the stack via arguments.caller.callee and Firefox dies if
44-
// you try to trace through "use strict" call chains. (#13335)
45-
//"use strict";
41+
// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
42+
// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
43+
// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
44+
// enough that all such attempts are guarded in a try block.
45+
"use strict";
4646

4747
// @CODE
4848
// build.js inserts compiled jQuery here

0 commit comments

Comments
 (0)