Let’s just set aside the fact that every character already knew they had to close the “gate” to the Upside Down so that this insanity might end, and that the entire spectacle of Will tapping out his message in Morse code was all for narrative naught. It’s a hole so big Eleven might have a tough time closing it, but oh well. Who cares? This season finale is still a fun ride. It’s got sweet middle-school kisses and Steve Harrington’s heart grows three sizes and Eleven officially becomes someone’s little girl and someone please clear these tears from my eyes so I can go on.
After an entire season of pointlessness, Billy finally makes his presence worthwhile in a swoony faux–seduction scene with Mrs. Wheeler. He rolls up in the midst of his search for Max to find a berobed Mrs. Wheeler, fresh out of a candlelit bubble bath made even more delightful by the addition of a steamy romantic page-turner. The two idle over some chitchat — Mrs. Wheeler actually falls for Billy’s dumb line about thinking she’s Nancy’s sister — and Dacre Montgomery proves his value to the entire series with one seductive cookie bite. He then heads off to the Byers’ place at Mrs. Wheeler’s direction (and with her eyes on that tight-jeaned booty). This scene is worth every snarl, saucy cigarette drag, and squealing car tire we’ve had to endure.
At the Byers’ house, where Eleven has just walked through the door, Mike is delighted. And confused. And infuriated. He’s so angry that Hopper kept Eleven from him “for 352 days” that he hurls his tiny body against the police chief, threatening to pummel him, but soon winds up in tears instead. It’s been a hard year for Mike, who has been holding far more emotion inside than any kid could handle.
The good news, however, is that with Eleven back on the scene, the “gate” can finally be closed. But first, they’ll need to get her down the hole in Hawkins Lab, past the rabid “demodogs” that have overtaken the facility. And lest we forget, before that can happen, they’ll also need to find a way to exorcise the shadow monster out of Will’s body.
It isn’t easy to play possessed without it coming off hokey, but Noah Schnapp knocks it out of the park in his big scenes here. Drugged with more sedative and driven out to Hopper’s cabin in the woods, he’s tied to a bed like a Victorian asylum patient. Joyce lights a fire in the woodstove and cranks up every unsafe electric heater she can find. The shadow monster and all its pawns — Dart, the other demogorgons, the vines in the tunnels — can’t stand to be exposed to heat, as we’ve seen all season, and so it’s only logical that an abundance of heat will send the monster fleeing from Will’s body. Or that’s the hope, at least.
Like any other shadow monster (ahem, Lost), it’s hard to CGI something credible into existence, but the silliness of the swirling black mass barreling out of Will’s mouth and then through the door is counteracted by the realistic drama of Joyce and Jonathan’s terror. Like a grieving banshee, Joyce determinedly forces the heat up even though it may kill her son — she’s just that desperate to have him back. Eventually and thankfully, Will’s soulful little eyes belong to him again.
Back at the Byers’ house, Lucas, Mike, Dustin, and Max have been left with Steve, who now fancies himself quite the babysitter and refuses their plan to crawl into the tunnel system and light a fire that will distract the demodogs away from Hawkins Lab. He’s got other things to worry about, anyway: Billy just rolled up, looking for his stepsister and itching for a fight. We’re all cheering hard for Steve, but alas, he gets his ass handed to him and is only rescued from severe facial disfigurement by Max, who jabs the nearby sedative into Billy’s neck and threatens his twigs and berries should he ever mess with them again. (This, by the way, is a very effective measure and it works well for Max. Good thinking, girl.)
With Steve out of commission, the party takes Billy’s car and heads off for the pumpkin patch to access the tunnel system. Billy is left behind but poor Steve is dragged along, concussed and swollen, yet holding a thoughtfully filled bag of ice to his face. Max, finally fulfilling her role as the party’s “zoomer,” takes them on a joy ride that’s as bumpy and terrifying as one would expect, considering she’s 13 years old and needs a piece of cardboard to reach the gas pedal.
At the pumpkin patch, they descend down into the tunnels with Steve now leading the way for safety’s sake. So, how exactly do they plan to beat back the forces of otherworldy evil? For that, they’ve got a hand-drawn map, some gasoline, and a lighter. But it works: The explosion has its intended effect and lures all the demodogs away, except one. After all the (justifiable) crap the boys gave Dustin about his attachment to Dart, it turns out the demogorgon does remember his former caretaker fondly. A little bit of nougat, that most underrated of Halloween candies, is enough to let the boys pass safely by.
That is, until they hear a whole swarm of demogorgons headed their way. Hustling up the rope ladder — I guess gym class does pay off sometimes — Max, Lucas, and Mike make it to safety, but Dustin and Steve are left to fend off the incoming horde. Luckily for them, the monsters sprint right past in a rush to reach Hawkins Lab, where Eleven and Hopper are working to close the gate.
Yes, Eleven and Hopper have finally worked through their earlier spat, and lovingly come to terms with the depth of their care for one another. On their way to Hawkins Lab, Eleven admits to Hopper that she went to visit her mother, but explains no more. And Hopper finally shares what he’s kept secret: that he lost his own daughter, Sarah, and that he kept Eleven locked up because he’s terrified to go through that type of pain again. It’s one of the most moving scenes of the series, and a stellar showcase for both Millie Bobby Brown and David Harbour.
At the lab, which Eleven boldly enters despite the fact that it was the site of her captivity and childhood torture, they find Dr. Owens still alive in the stairwell. He’s wounded, but mostly okay. Phew. Together, Hopper and Eleven fight their way through the lab — and don’t think we didn’t notice that Jurassic Park reference with Hopper’s use of the knife as a mirror, Duffer Brothers! — before finally making their way to the pit. And the gate to the Upside Down.
Although the modern string-art aesthetic of the gate is quite captivating, this final scene is a bit of a letdown. Dangling in a cage in midair, Hopper plays defense by shooting back the demogorgons while Eleven uses all her might (and her rage-filled memories of Dr. Brenner) to box the shadow monster in and fuse together the edges of the gate. Millie Bobby Brown is, as always, a tiny triumph, but like most whizbang theatrics these days, the scene relies too heavily on CGI for its wows.
Nonetheless, when that gash in the space-time continuum closes up and Eleven collapses into Hopper’s arms with blood rolling out of both nostrils this time, I teared up quite a bit. Be honest, you probably did, too. These kids have wormed their way too far into our hearts to not get at least a little weepy.
Final Quests
With the gate closed and the shadow monster banished to the Upside Down, the finale winds down with a nice little montage that goes as follows:
• Murray, much to his delight, reaches a national audience with his Hawkins Lab scoop. Of course, the media is reporting his “watered down” theory of toxic chemicals that killed Barb, but it’s still a victory when troops hang up a closed sign on the gate at Hawkins Lab and Murray gets to flip off a soldier.
• Barb, who was once again a little forgotten toward the end of the season, is finally laid to rest. You have to wonder what was in that coffin, though.
• The Snowball Dance, which, if you recall, Mike asked Eleven to attend during last year’s mayhem, produces as many Polaroid-friendly moments as the boys’ Halloween costumes did earlier this season. Far and away the best moment, of course, is Dustin’s John Oates–esque mullet, spritzed and styled into a curly version of Steve’s ’do. That Farrah Fawcett hairspray really works!
• Dustin finally gets his wish and has a sweet moment with Nancy, albeit after that truly heartbreaking scene of his rejection. Gaten Matarazzo, I will dance with you anytime.
• Our last glimpse of the kids is Mike and Eleven’s shared kiss on the dance floor (to the Police’s notoriously creepy “Every Breath You Take”), which is just so adorable. But the final moment I want to remember is Dr. Owens sliding that birth certificate across the diner table to Hopper. Eleven’s name is officially Jane Hopper. She has a mother and a father, and this tale of a young woman made to suffer is finished with a happy ending.
• … Or is it? As we see in the season’s final moments, the shadow monster is still lurking in the Upside Down, so it’s only a matter of time until Stranger Things 3 throws Hawkins into chaos yet again.
Get all your Stranger Things 2 questions answered at the show’s Vulture Festival LA panel on November 18! Tickets available here.
By submitting your email, you agree to our
Terms and Privacy Notice
and to receive email correspondence from us. This site is protected by reCAPTCHA and the Google
Privacy Policy and
Terms of Service apply.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
Already a subscriber?
Already a subscriber?
`;
// integrate Sub(x) scripts and elements
if (hostname !== 'subs.nymag.com') { // do not integrate on this subdomain
document.head.appendChild(trackingScript);
document.body.insertAdjacentHTML('beforeend', subXAnimationElements);
}
There was an error processing the request. Please try again later."}).catch(e=>console.error("Error verifying email: ",e)))(r.querySelector(".content"),o.bannerCTAVerification)})):(l.remove(),s.remove()),o.dismissable||n.remove(),o.useAlertIcon||a.remove(),r.classList.add("show"),n.addEventListener("click",()=>{u(),r.classList.remove("show")})}else r.remove()}});
}, {"1":1,"6":6,"12":12,"35":35,"40":40}];
window.modules["global-nav.client"] = [function(require,module,exports){"use strict";const dom=require(3),auth=require(12),signInButton=dom.find(".user-signin"),signOutButton=dom.find(".user-signout"),globalNav=dom.find('[class^="global-nav"]'),body=dom.find("body"),dropdownItems=dom.findAll(".dropdown-wrap"),gtm=require(1),appendLandingPageParams=require(136),pageUri=require(124).getPageUri(),subscriptionPromoLinks=dom.findAll(".persist-params"),searchString=window.location.search||"";function closeDropdowns(e){let n=globalNav.querySelectorAll(".dropdown.open");dropdownItems.forEach(function(t){let o=t.querySelector(".dropdown");!n||t.contains(e.target)&&27!==e.keyCode||o.classList.remove("open")})}function gtmSendReport(e,n,t){let o={eventCategory:"ecommerce",eventAction:"componentClick",brand:e,dimension23:"global-nav",list:pageUri,pageZone:"header",variant:"nav-link"};"global-nav-link"===t&&(o.eventLabel=n.href),gtm.reportNow(o)}function updateElementTargetUrlsIfQueryStrings(e){if(searchString){const n=new URLSearchParams(searchString);let t=e.href;if(t.includes("?")){const o=t.split("?"),i=new URLSearchParams(o[1]);for(let e of n.entries())i.set(e[0],e[1]);t=`${o[0]}?${i.toString()}`,e.href=t}else e.href=`${t}?${n.toString()}`}}function init(e){const n=e.querySelectorAll(".to-landing-page");window.addEventListener("auth:init",()=>{signInButton.addEventListener("click",function(e){e.preventDefault(),auth.showEmbeddedLoginFlow("top navigation")}),signOutButton.addEventListener("click",function(e){e.preventDefault(),gtmSendReport("Sign Out",e.target,"user-info-link"),auth.logout()}),auth.isAuthenticated()&&e.classList.add("signed-in"),auth.isSubscriber()&&e.classList.add("subscribed"),e.querySelectorAll(".user-link").forEach(e=>{e.classList.add("active")}),subscriptionPromoLinks.forEach(e=>{updateElementTargetUrlsIfQueryStrings(e)}),appendLandingPageParams(n)})}dropdownItems.forEach(function(e){e.addEventListener("click",function(){e.querySelector(".dropdown").classList.toggle("open")})}),body.addEventListener("click",closeDropdowns),document.addEventListener("keydown",closeDropdowns),globalNav.addEventListener("click",function(e){let n=e.target;n.classList.contains("global-nav-track")&>mSendReport(n.text,n,"global-nav-link")}),module.exports=init;
}, {"1":1,"3":3,"12":12,"124":124,"136":136}];
window.modules["aaa-module-mounting.legacy"] = [function(require,module,exports){"use strict";const _pickBy=require(221),_each=require(408),Fingerprint2=require(407),DS=require(406),Eventify=require(246);function registerGlobals(){window.DS=DS,window.Eventify=Eventify,window.Fingerprint2=Fingerprint2,DS.value("Eventify",Eventify),DS.value("Fingerprint2",Fingerprint2),DS.value("$document",window.document),DS.value("$window",window)}function mountDollarSliceComponents(){DS.service("components",["$document","$module",function(e,n){var o=_pickBy(n.definitions,e=>e.providerStrategy===n.providers.controller),r=Object.keys(o);function t(e){return o=>{try{n.get(e,o)}catch(e){logMountError(o,e)}}}_each(r,n=>{var o=e.querySelectorAll('[data-uri*="/_components/'+n+'/"]'),r=e.querySelectorAll('[data-uri$="/_components/'+n+'"]');_each(o,t(n)),_each(r,t(n))}),this.components=r}]),DS.get("components")}function logMountError(e,n){const o=e.outerHTML.slice(0,e.outerHTML.indexOf(e.innerHTML));console.error("Error attaching controller to "+o,n)}registerGlobals(),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{mountDollarSliceComponents()}):mountDollarSliceComponents();
}, {"221":221,"246":246,"406":406,"407":407,"408":408}];
window.modules["ads.legacy"] = [function(require,module,exports){"use strict";const _map=require(118),_forEach=require(107),_isString=require(268),_intersectionWith=require(409),_isEqual=require(274),_each=require(408),_debounce=require(182),_sortBy=require(205),page=require(124),visit=require(114);DS.service("adService",["Eventify","$cid","$document","$window",function(e,t,a,i){var o,n,s,r,d,c,u,l,g={},p=this,h=[],f=visit.getQueryParamsObject(["utm_campaign"]),m=document.querySelector('script[data-type="ad-a9"]'),b=[],w=!1,v=[],y=document.querySelector('script[data-name="ad-doubleverify"]');document.querySelector('script[data-name="concert-ads"]')||(i.NYM={},i.NYM.analytics={},i.NYM.analytics.adStartTime=i.performance.now(),i.googletag=i.googletag||{},i.googletag.cmd=i.googletag.cmd||[],u=i.googletag,(m||y)&&(i.googletag.cmd=i.googletag.cmd||[],i.googletag.cmd.push(function(){i.googletag.pubads().disableInitialLoad()})),m&&(l=i.setInterval(function(){void 0!==window.apstag&&void 0!==window.apstag.timeout&&(i.clearInterval(l),window.apstag.cleared=!0,l=null)},10),setTimeout(function(){l&&(i.clearInterval(l),i.googletag.pubads().refresh(),window.apstag||console.log("MESSAGE: Timeout for A9 load exceeded, aborting"))},500)),y&&(b.push(new Promise(function(e){w?e():v.push(e)})),c=i.setTimeout(T,2500)),o=function(e){var t,a,o=e.data,n=[];return o.loaded?e:(o.loaded=!0,t=null,(t=o.sizes?u.defineSlot(o.name,o.sizes,o.id).addService(u.pubads()):u.defineOutOfPageSlot(o.name,o.id).addService(u.pubads())).setTargeting("adid",o.id),f.hasOwnProperty("utm_campaign")&&t.setTargeting("utmcamp",f.utm_campaign),a=p.getAdCount(o.label),t.setTargeting("label",o.label+"_"+o.site+"-"+a),u.display(o.id),u.pubads().addEventListener("slotOnload",function(){i.NYM.analytics.firstAdLoadTime||(i.NYM.analytics.firstAdLoadTime=i.performance.now(),i.NYM.analytics.firstAdLoadLabel=e.data.label)}),n=_(o),Promise.all(b).then(function(){n?window.apstag&&window.apstag.cleared?window.apstag.fetchBids({slots:[n],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([t],{changeCorrelator:!1})})}):y&&u.pubads().refresh([t],{changeCorrelator:!1}):u.pubads().refresh([t],{changeCorrelator:!1})}),e.slot=t,e)},n=function(e){var a,i,o,n=t(),s=e.getAttribute("data-name"),r=e.getAttribute("data-sizes"),d=e.getAttribute("data-label"),c=e.getAttribute("data-site");n=e.id,r&&r.length?(r=r.split(","),a=[],_map(r,function(e){e=e.split("x"),i=parseInt(e[0]),o=parseInt(e[1]),a.push([i,o])})):(e.classList.add("oop"),a=!1),this.data={id:n,name:s,sizes:a,loaded:!1,label:d,site:c},g[n]=this},r=function(e){u.cmd.push(function(){var t=o(e);g[e.data.id]=t})},s=function(e){var t=[];e.slot?(t=_(e))&&window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[t],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([e.slot],{changeCorrelator:!1})})}):e&&r(e)},u.cmd.push(function(){var e,t,o,n=page.getMeta("article:tag"),s=page.getMeta("author"),r=i.location.href,d=(e=a.head.querySelector(".head-gtm"),t=a.body.querySelector(".gtm"),e&&"top"===e.getAttribute("data-gtm")?"gtmtop":t&&"bottom"===t.getAttribute("data-gtm")?"gtmbottom":"");o=[],_forEach([n,s,d],function(e){_forEach(e.split(","),function(e){(e=e.trim().toLowerCase().replace(/\s/g,"-").replace(/\'|\’/g,"")).length&&o.push(e)})}),u.pubads().setTargeting("kw",o),u.pubads().setTargeting("entry_group",o),r=r.slice(r.lastIndexOf("/")+1),u.pubads().setTargeting("pn",r),u.companionAds().setRefreshUnfilledSlots(!0),u.pubads().enableAsyncRendering(),u.enableServices()}),this.load=r,this.create=function(e){return new n(e)},this.refresh=function(e){var t;_isString(e)?(t=this.getById(e),s(t)):s(e)},this.remove=function(e){var t=e.data.id;a.getElementById(t).innerHTML=""},this.getAdCount=function(e){var t,a=0,i=Object.keys(g);return _each(i,function(i){(t=g[i]).data.loaded&&t.data.label===e&&a++}),a},this.getById=function(e){return g[e]},d=_debounce(function(){var e={TopLeaderboard:1,RightColTopMPU:2,outOfPage:99,"homepageTakeover/TopLeaderboard":1},t=_sortBy(h,function(t){return e[t.data.label]||10});_forEach(t,function(e){return e.data.sizes?r(e):i.setTimeout(function(){r(e)},2e3)}),y&&window.PQ.cmd.push(()=>{try{window.PQ.loadSignals(["ids","bsc","vlp"],T)}catch(e){T(),console.error(`There has been an error loading Double Verify signals: ${e}`)}}),h=[]},10),this.addToPageLoadQueue=function(e){h.push(e),d()});function _(e){var t,a=e.sizes;return a=_intersectionWith(a,[[970,250],[970,90],[728,90],[300,600],[300,250],[320,100],[320,50]],_isEqual),e.sizes&&e.sizes.length&&(t={slotID:e.id,sizes:a,slotName:e.label}),t}function T(){i.clearTimeout(c),w=!0,_forEach(v,function(e){e()})}}]);
}, {"107":107,"114":114,"118":118,"124":124,"182":182,"205":205,"268":268,"274":274,"408":408,"409":409}];
window.modules["cid.legacy"] = [function(require,module,exports){"use strict";DS.service("$cid",function(){var r=Math.floor(100*Math.random());return function(){return"cid-"+ ++r}});
}, {}];
window.modules["client.legacy"] = [function(require,module,exports){"use strict";require("cid.legacy"),require("ads.legacy"),require("facebook.legacy"),require("aaa-module-mounting.legacy");
}, {"cid.legacy":"cid.legacy","aaa-module-mounting.legacy":"aaa-module-mounting.legacy","ads.legacy":"ads.legacy","facebook.legacy":"facebook.legacy"}];
window.modules["facebook.legacy"] = [function(require,module,exports){"use strict";DS.service("facebook",[function(){this.fb=function(i){window.FB&&window.FB[i].apply(this,Array.prototype.slice.call(arguments,1))}}]);
}, {}];
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o typeof key === 'string' && key.match(/\.legacy$/)).forEach(key => window.require(key));
}
function tryToMount(fn, el, name) {
try {
fn(el); // init the controller
} catch (e) {
const elementTag = el.outerHTML.slice(0, el.outerHTML.indexOf(el.innerHTML));
console.error(`Error initializing controller for "${name}" on "${elementTag}"`, e);
}
}
/**
* mount client.js component controllers
*/
function mountComponentModules() {
Object.keys(window.modules).filter(key => typeof key === 'string' && key.match(/\.client$/)).forEach(key => {
let controllerFn = window.require(key);
if (typeof controllerFn === 'function') {
const name = key.replace('.client', ''),
instancesSelector = `[data-uri*="_components/${name}/"]`,
defaultSelector = `[data-uri$="_components${name}"]`,
instances = document.querySelectorAll(instancesSelector),
defaults = document.querySelectorAll(defaultSelector);
for (let el of instances) {
tryToMount(controllerFn, el, name);
}
for (let el of defaults) {
tryToMount(controllerFn, el, name);
}
}
});
}
// Make sure that a `window.process.env.NODE_ENV` is available in the client for any dependencies,
// services, or components that could require it
// note: the `` value is swapped for the actual environment variable in /lib/cmd/compile/scripts.js
window.process = window.process || {};
window.process.env = window.process.env || {};
if (!window.process.env.NODE_ENV) {
window.process.env.NODE_ENV = '';
}
// note: legacy controllers that require legacy services (e.g. dollar-slice) must
// wait for DOMContentLoaded to initialize themselves, as the files themselves must be mounted first
mountLegacyServices();
mountComponentModules();
// ]]