2017-03-06 80 views
1

在这里,我得到了一个错误:"ReferenceError: z is not defined at func功能不看变量在封闭

const func = (x) => x + z; 
const func2 = (z) => func; 
const a = func2(1); 
const b = a(2); 

我知道我可以写这样的:

const func2 = (z) => (x) => x + z; 
const a = func2(1); 
const b = a(2); 

但我添加文档注释使用JSDoc为每个功能,这种方式对我来说更好:

/** 
* @param {string|number} x 
* @returns {string} 
*/ 
const func = (x) => x + z; 
/** 
* @param {number} z 
* @returns {Function} 
*/ 
const func2 = (z) => func; 
const a = func2(1); 
const b = a(2); 

而不是:

/** 
* @param {number} z 
* @returns {Function} 
*/ 
const func2 = (z) => { 
    /** 
    * @param {string|number} x 
    * @returns {string} 
    */ 
    return (x) => x + z; 
}; 
const a = func2(1); 
const b = a(2); 

我可能是错的,但是最好的解决方法是什么?

+2

JavaScript具有*词法*范围,而不是动态的。你的'func2'接受一个参数'z',但它不会传递给'func',因此它没有在那里定义。您必须编写嵌套的定义,或显式传递参数。 – deceze

回答

2

你得到的错误,因为

const func = (x) => x + z; 

尝试使用z,这是不是在范围吧。

func仍然需要在func2中定义,因此它有权访问z。您可以使用详细的形式,所以你可以创建const和准文档注释吧:

/** 
* @param {number} z 
* @returns {Function} 
*/ 
const func2 = (z) => { 
    /** 
    * @param {string|number} x 
    * @returns {string} 
    */ 
    const func = (x) => x + z; 
    return func; 
}; 
const a = func2(1); 
const b = a(2); 

...虽然JSDoc 可以甚至足够聪明来接他们在简洁的形式:

/** 
* @param {number} z 
* @returns {Function} 
*/ 
const func2 = (z) => 
    /** 
    * @param {string|number} x 
    * @returns {string} 
    */ 
    (x) => x + z 
; 
const a = func2(1); 
const b = a(2); 
+0

非常感谢! – rel1x

2

您尚未创建闭包。

范围取决于功能定义的位置,而不是它被调用的位置。

const func = function (x) { return x + z).bind(this); 
const func2 = function (z) { return func() }.bind(this); 

你必须定义其他内一个函数创建一个封闭,并继续存取范围:以

你的代码是等价的。

2

您可以使用一个真正的闭包,它将返回一个范围超过z的函数。

const func2 = z => x => x + z; 
 
const a = func2(1); 
 
const b = a(2); 
 

 
console.log(a) 
 
console.log(b);

+1

但他如何评论? –