函数能否仅归属于其声明所在的块作用域?
块级作用域函数绑定方案
可以实现,核心是利用ES6的块级作用域绑定规则或严格模式限制,全程不需要用到立即执行函数这类特殊写法,具体操作如下:
为什么你的函数会泄露到块外
你遇到的块内函数外部可访问的情况,本质是传统function 函数名() {}声明的提升特性导致的:在非严格模式的ES5及更早环境中,块内的函数声明会直接提升到块所在的全局作用域/父函数作用域,自然外部可以随意调用。
两种实现块级绑定的方法
- 方法1:用
const/let定义函数表达式const和let本身自带块级作用域绑定属性,用它们赋值的函数表达式只会存在于当前块内,外部无法访问,示例代码如下:
{ // 用const定义的函数仅在当前块内生效 const blockOnlyFn = function() { console.log('仅块内可调用') } // 块内调用正常 blockOnlyFn() // 输出:仅块内可调用 } // 块外调用直接报错 blockOnlyFn() // ReferenceError: blockOnlyFn is not defined
注意不要用var定义函数表达式,var没有块级作用域限制,函数还是会泄露到块外
- 方法2:开启严格模式限制函数声明作用域
如果你还是习惯用function关键字做函数声明,只要在代码开头开启严格模式(添加'use strict'声明),ES6标准明确规定严格模式下块内的函数声明作用域仅限定在当前块内,不会提升到外部,示例代码如下:
'use strict' { function blockOnlyFn() { console.log('仅块内可调用') } blockOnlyFn() // 输出:仅块内可调用 } blockOnlyFn() // ReferenceError: blockOnlyFn is not defined
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

