Mastering JavaScript Function Parameters: Defaults, Rest, and TDZ Explained
This article explores JavaScript functions as first‑class citizens, detailing how to set default parameter values in ES5 and ES6, the impact on the arguments object, the temporary dead zone for defaults, and the usage and constraints of rest parameters with practical code examples.
In JavaScript, functions are first‑class citizens that can be assigned, passed, and returned like any other value, making them central to the language.
Default Parameter Values
Simulating default parameters in ES5:
function makeRequest(url, time, callback) {
time = (typeof time !== 'undefined') ? time : 2000;
callback = (typeof callback !== 'undefined') ? callback : function () {
// ...
};
}In ES6 you can declare defaults directly:
function makeRequest(url, time = 2000, callback = function () {}) {
// ...
}According to the ES6 specification, only
urlis required;
timeand
callbackare optional. All of the following calls are valid:
makeRequest('/foo');
makeRequest('/foo', 500);
makeRequest('/foo', 500, function() { /* ... */ });Effect of Default Parameters on the arguments Object
function mixArgs(first, second) {
console.log(first === arguments[0]);
console.log(second === arguments[1]);
first = 'c';
second = 'd';
console.log(first === arguments[0]);
console.log(second === arguments[1]);
}Result (non‑strict mode):
true
true
true
trueIn non‑strict mode, changes to named parameters are reflected in the
argumentsobject. In strict mode the linkage is broken:
function mixArgs(first, second) {
'use strict';
console.log(first === arguments[0]);
console.log(second === arguments[1]);
first = 'c';
second = 'd';
console.log(first === arguments[0]);
console.log(second === arguments[1]);
}
mixArgs('a', 'b');Result:
1
true
false
false
falseTemporal Dead Zone of Default Parameters
ES6
letand
consthave a temporal dead zone (TDZ); default parameters share the same behavior. Parameters are bound before the function body runs, and they cannot be accessed until they are initialized.
function add(first = second, second) {
return first + second;
}
add(1, 1); // equivalent to let first = 1; let second = 1;
add(undefined, 1); // throws because <code>second</code> is not initialized when <code>first</code> is evaluatedRest Parameters
Placing
...before a named parameter makes it a rest parameter, which collects all remaining arguments into an array.
function pick(obj, ...keys) {
let result = {};
for (let i = 0; i < keys.length; i++) {
result[keys[i]] = obj[keys[i]];
}
return result;
}Example usage mimicking Underscore.js
pick():
var article = {
title: 'js-函数',
author: 'zh',
age: '20'
};
console.log(pick(article, 'title', 'age'));Result:
{ title: "js-函数", age: "20" }The function’s
lengthproperty counts only named parameters; rest parameters do not affect it (e.g.,
pick.length === 1because only
objis counted).
Two constraints on rest parameters:
Only one rest parameter is allowed, and it must be the last parameter.
Rest parameters cannot be used in object literal setter definitions.
let object = {
set a(...val) { // ❌ SyntaxError
// ...
}
};In the next lesson we will discuss arrow functions. See you next time!
MaoDou Frontend Team
Open-source, innovative, collaborative, win‑win – sharing frontend tech and shaping its future.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.