ES5 Compliance for ServiceNow
ServiceNow runs on Mozilla Rhino engine which only supports ES5 JavaScript (2009 standard). All server-side scripts MUST use ES5 syntax.
Forbidden Syntax (WILL CAUSE SyntaxError)
ES6+ Syntax
ES5 Alternative
const x = 5
var x = 5
let items = []
var items = []
() => {}
function() {}
Hello ${name}
'Hello ' + name
for (x of arr)
for (var i = 0; i < arr.length; i++)
{a, b} = obj
var a = obj.a; var b = obj.b;
[a, b] = arr
var a = arr[0]; var b = arr[1];
...spread
Use
Array.prototype.slice.call()
class MyClass {}
Use constructor functions
async/await
Use GlideRecord callbacks
Promise
Use GlideRecord with callbacks
Common Patterns
Variable Declarations
// WRONG - ES6
const
MAX_RETRIES
=
3
let
currentUser
=
gs
.
getUser
(
)
// CORRECT - ES5
var
MAX_RETRIES
=
3
var
currentUser
=
gs
.
getUser
(
)
Functions
// WRONG - Arrow functions
var
active
=
incidents
.
filter
(
(
inc
)
=>
inc
.
active
)
var
process
=
(
)
=>
{
return
"done"
}
// CORRECT - ES5 functions
var
active
=
[
]
for
(
var
i
=
0
;
i
<
incidents
.
length
;
i
++
)
{
if
(
incidents
[
i
]
.
active
)
{
active
.
push
(
incidents
[
i
]
)
}
}
var
process
=
function
(
)
{
return
"done"
}
String Concatenation
// WRONG - Template literals
var
message
=
Incident
${
number
}
assigned to
${
user
}
// CORRECT - String concatenation
var
message
=
"Incident "
+
number
+
" assigned to "
+
user
Loops
// WRONG - for...of
for
(
var
item
of
items
)
{
gs
.
info
(
item
)
}
// CORRECT - Traditional for loop
for
(
var
i
=
0
;
i
<
items
.
length
;
i
++
)
{
gs
.
info
(
items
[
i
]
)
}
Default Parameters
// WRONG - Default parameters
function
process
(
incident
,
priority
=
3
)
{
// ...
}
// CORRECT - Manual defaults
function
process
(
incident
,
priority
)
{
if
(
typeof
priority
===
"undefined"
)
{
priority
=
3
}
// ...
}
Automatic Validation
Before deploying any server-side script:
Check for
const
/
let
declarations - convert to
var
Check for arrow functions
=>
- convert to
function()
Check for template literals
`
- convert to string concatenation
Check for destructuring
{a, b}
- convert to explicit property access
Check for
for...of
loops - convert to index-based loops
Exception: Client Scripts
Client-side scripts (Client Scripts, UI Policies) run in the browser and MAY support ES6+ depending on user's browser. However, for maximum compatibility, ES5 is still recommended.
es5-compliance
安装
npx skills add https://github.com/groeimetai/snow-flow --skill es5-compliance