能否在调用函数时将一个函数的作用域转移给另一个函数?
作用域传递问题的解决方案
先看原可正常运行的代码:
function parent() { let name = 'joe'; printName(); function printName() {console.log(name)} }
当把printName移到parent外部后,代码因name是parent的局部变量而无法运行:
function parent() { let name = 'joe'; printName(); } function printName() {console.log(name)}
不存在类似.bind()仅针对this那样,可以直接传递整个作用域的方法,但有几种实用的替代方案:
- 直接传递变量作为参数
这是最直观的方式,明确把需要的变量传给外部函数:
function parent() { let name = 'joe'; printName(name); } function printName(name) {console.log(name)}
- 利用闭包绑定作用域
通过工厂函数生成绑定了目标变量的函数,借助闭包保留变量的作用域:
function createPrintName(name) { return function() { console.log(name); }; } function parent() { let name = 'joe'; const printName = createPrintName(name); printName(); }
- 用对象封装上下文
如果需要传递多个变量,可以把它们封装成一个上下文对象,统一传递:
function parent() { const context = { name: 'joe', age: 30 }; printName(context); } function printName(ctx) { console.log(ctx.name, ctx.age); }
内容的提问来源于stack exchange,提问作者stackers
相关产品推荐
相关产品推荐

