Improve no-func-assign docs and add tests
See original GitHub issueTell us about your environment
Eslint demo page with Eslint v7.9.0 - Demo URL
- ESLint Version: v7.9.0
- Node Version: Doesn’t matter (web hosted)
- npm Version: Doesn’t matter (web hosted)
What parser (default, @babel/eslint-parser
, @typescript-eslint/parser
, etc.) are you using? - default
Please show your full configuration:
Configuration
{
"parserOptions": {
"ecmaVersion": 12,
"sourceType": "script",
"ecmaFeatures": {}
},
"rules": {
"constructor-super": 2,
"for-direction": 2,
"getter-return": 2,
"no-async-promise-executor": 2,
"no-case-declarations": 2,
"no-class-assign": 2,
"no-compare-neg-zero": 2,
"no-cond-assign": 2,
"no-const-assign": 2,
"no-constant-condition": 2,
"no-control-regex": 2,
"no-debugger": 2,
"no-delete-var": 2,
"no-dupe-args": 2,
"no-dupe-class-members": 2,
"no-dupe-else-if": 2,
"no-dupe-keys": 2,
"no-duplicate-case": 2,
"no-empty": 2,
"no-empty-character-class": 2,
"no-empty-pattern": 2,
"no-ex-assign": 2,
"no-extra-boolean-cast": 2,
"no-extra-semi": 2,
"no-fallthrough": 2,
"no-global-assign": 2,
"no-import-assign": 2,
"no-inner-declarations": 2,
"no-invalid-regexp": 2,
"no-irregular-whitespace": 2,
"no-misleading-character-class": 2,
"no-mixed-spaces-and-tabs": 2,
"no-new-symbol": 2,
"no-obj-calls": 2,
"no-octal": 2,
"no-prototype-builtins": 2,
"no-redeclare": 2,
"no-regex-spaces": 2,
"no-self-assign": 2,
"no-setter-return": 2,
"no-shadow-restricted-names": 2,
"no-sparse-arrays": 2,
"no-this-before-super": 2,
"no-undef": 2,
"no-unexpected-multiline": 2,
"no-unreachable": 2,
"no-unsafe-finally": 2,
"no-unsafe-negation": 2,
"no-unused-labels": 2,
"no-unused-vars": 2,
"no-useless-catch": 2,
"no-useless-escape": 2,
"no-with": 2,
"require-yield": 2,
"use-isnan": 2,
"valid-typeof": 2
},
"env": {}
}
Only actual change from default config is - disabled “no-func-assign”
What did you do? Please include the actual source code causing the issue, as well as the command that you used to run ESLint.
var a = function hello() {
'use strict';
hello = 123; // should throw error here
};
a()
Ran demo web version - Demo URL
What did you expect to happen?
I have disabled “no-func-assign” rule.
On the line “hello = 123” within named function expression, this will always throw a runtime JS error saying TypeError: Assignment to constant variable
. That means, this is a assignment to a (implicitly created) immutable binding for the function name “hello”. “no-const-assign” rule should also catch this error, irrespective of “no-func-assign” - because this is a const reassignment.
The spec says that for named function expressions, there is a implicitly created extra scope above the function local scope which has immutable binding for funcName = funcObject. So, this means -
A. This code should not be allowed
var a = function hello() {
'use strict';
hello = 123; // reassign const
};
B. but this should be allowed -
var a = function hello() {
'use strict';
const hello = 123; // creates new const
};
What actually happened? Please include the actual, raw output from ESLint.
No lint error or warning (lint-free)
Are you willing to submit a pull request to fix this bug?
Yes
Issue Analytics
- State:
- Created 3 years ago
- Comments:12 (6 by maintainers)
Top GitHub Comments
Sounds good to me!
Marked as an accepted issue to improve documentation for
no-func-assign
. In particular, to add named function expressions.The actual document doesn’t even mention named function expressions and doesn’t have any examples with them. Also, there are no test cases, so it’s possible that the original intention was to check only function declarations:
Either way, this rule checks function expressions from the start (v0.0.9), this behavior does make sense, so we should update the docs to reflect the actual behavior.
Feel free to pick it up. I have not done any work on this. (in case you meant to ask me)